[WIP] Minimize changes to blockly core
@@ -1,26 +0,0 @@
|
||||
*** 943,968 ****
|
||||
var expandOption = {enabled: hasCollapsedBlocks};
|
||||
expandOption.text = Blockly.Msg.EXPAND_ALL;
|
||||
expandOption.callback = function() {
|
||||
+ Blockly.Instrument.initializeStats("expandAllCollapsedBlocks");
|
||||
+ Blockly.Instrument.timer(
|
||||
+ function () {
|
||||
+ var ms = 0;
|
||||
+ for (var i = 0; i < topBlocks.length; i++) {
|
||||
+ var block = topBlocks[i];
|
||||
+ while (block) {
|
||||
+ setTimeout(block.setCollapsed.bind(block, false), ms);
|
||||
+ block = block.getNextBlock();
|
||||
+ ms += COLLAPSE_DELAY;
|
||||
+ }
|
||||
+ }
|
||||
+ Blockly.resetWorkspaceArrangements();
|
||||
+ },
|
||||
+ function (result, timeDiff) {
|
||||
+ Blockly.Instrument.stats.totalTime = timeDiff;
|
||||
+ Blockly.Instrument.displayStats("expandAllCollapsedBlocks");
|
||||
+ }
|
||||
+ );
|
||||
};
|
||||
options.push(expandOption);
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
***************
|
||||
*** 255,266 ****
|
||||
* @param {!Blockly.Workspace} workspace The workspace to delete callers from.
|
||||
* @param {!Array.<string>} paramNames Array of new parameter names.
|
||||
* @param {!Array.<string>} paramIds Array of unique parameter IDs.
|
||||
*/
|
||||
Blockly.Procedures.mutateCallers = function(name, workspace,
|
||||
- paramNames, paramIds) {
|
||||
var callers = Blockly.Procedures.getCallers(name, workspace);
|
||||
for (var x = 0; x < callers.length; x++) {
|
||||
- callers[x].setProcedureParameters(paramNames, paramIds);
|
||||
}
|
||||
};
|
||||
|
||||
--- 256,270 ----
|
||||
* @param {!Blockly.Workspace} workspace The workspace to delete callers from.
|
||||
* @param {!Array.<string>} paramNames Array of new parameter names.
|
||||
* @param {!Array.<string>} paramIds Array of unique parameter IDs.
|
||||
+ * @param {boolean} opt_intializeTracking indicate whether paramId tracking should start
|
||||
+ * Is undefined (falsey) as default. // [lyn, 10/26/13] added this.
|
||||
*/
|
||||
Blockly.Procedures.mutateCallers = function(name, workspace,
|
||||
+ paramNames, paramIds,
|
||||
+ opt_initializeTracking) {
|
||||
var callers = Blockly.Procedures.getCallers(name, workspace);
|
||||
for (var x = 0; x < callers.length; x++) {
|
||||
+ callers[x].setProcedureParameters(paramNames, paramIds, opt_initializeTracking);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
***************
|
||||
*** 82,99 ****
|
||||
<text class="blocklyIconMark" x="8" y="13">!</text>
|
||||
*/
|
||||
var iconShield = Blockly.createSvgElement('path',
|
||||
- {'class': 'blocklyIconShield',
|
||||
'd': 'M 2,15 Q -1,15 0.5,12 L 6.5,1.7 Q 8,-1 9.5,1.7 L 15.5,12 ' +
|
||||
'Q 17,15 14,15 z'},
|
||||
this.iconGroup_);
|
||||
this.iconMark_ = Blockly.createSvgElement('text',
|
||||
- {'class': 'blocklyIconMark',
|
||||
'x': Blockly.Icon.RADIUS,
|
||||
'y': 2 * Blockly.Icon.RADIUS - 3}, this.iconGroup_);
|
||||
this.iconMark_.appendChild(document.createTextNode('!'));
|
||||
};
|
||||
|
||||
/**
|
||||
* Show or hide the warning bubble.
|
||||
* @param {boolean} visible True if the bubble should be visible.
|
||||
*/
|
||||
--- 82,120 ----
|
||||
<text class="blocklyIconMark" x="8" y="13">!</text>
|
||||
*/
|
||||
var iconShield = Blockly.createSvgElement('path',
|
||||
+ {'class': 'blocklyWarningIconShield',
|
||||
'd': 'M 2,15 Q -1,15 0.5,12 L 6.5,1.7 Q 8,-1 9.5,1.7 L 15.5,12 ' +
|
||||
'Q 17,15 14,15 z'},
|
||||
this.iconGroup_);
|
||||
this.iconMark_ = Blockly.createSvgElement('text',
|
||||
+ {'class': 'blocklyWarningIconMark',
|
||||
'x': Blockly.Icon.RADIUS,
|
||||
'y': 2 * Blockly.Icon.RADIUS - 3}, this.iconGroup_);
|
||||
this.iconMark_.appendChild(document.createTextNode('!'));
|
||||
};
|
||||
|
||||
/**
|
||||
+ * Create the text for the warning's bubble.
|
||||
+ * @param {string} text The text to display.
|
||||
+ * @return {!SVGTextElement} The top-level node of the text.
|
||||
+ * @private
|
||||
+ */
|
||||
+ Blockly.Warning.prototype.textToDom_ = function(text) {
|
||||
+ var paragraph = /** @type {!SVGTextElement} */ (
|
||||
+ Blockly.createSvgElement(
|
||||
+ 'text', {'class': 'blocklyText blocklyErrorWarningText', 'y': Blockly.Bubble.BORDER_WIDTH},
|
||||
+ null));
|
||||
+ var lines = text.split('\n');
|
||||
+ for (var i = 0; i < lines.length; i++) {
|
||||
+ var tspanElement = Blockly.createSvgElement('tspan',
|
||||
+ {'dy': '1em', 'x': Blockly.Bubble.BORDER_WIDTH}, paragraph);
|
||||
+ var textNode = document.createTextNode(lines[i]);
|
||||
+ tspanElement.appendChild(textNode);
|
||||
+ }
|
||||
+ return paragraph;
|
||||
+ };
|
||||
+
|
||||
+ /**
|
||||
* Show or hide the warning bubble.
|
||||
* @param {boolean} visible True if the bubble should be visible.
|
||||
*/
|
||||
@@ -1,34 +0,0 @@
|
||||
***************
|
||||
*** 342,348 ****
|
||||
}
|
||||
if (firstRealGrandchild &&
|
||||
firstRealGrandchild.nodeName.toLowerCase() == 'block') {
|
||||
- blockChild = Blockly.Xml.domToBlock(workspace, firstRealGrandchild,
|
||||
opt_reuseBlock);
|
||||
if (blockChild.outputConnection) {
|
||||
input.connection.connect(blockChild.outputConnection);
|
||||
--- 415,421 ----
|
||||
}
|
||||
if (firstRealGrandchild &&
|
||||
firstRealGrandchild.nodeName.toLowerCase() == 'block') {
|
||||
+ blockChild = Blockly.Xml.domToBlockInner(workspace, firstRealGrandchild,
|
||||
opt_reuseBlock);
|
||||
if (blockChild.outputConnection) {
|
||||
input.connection.connect(blockChild.outputConnection);
|
||||
***************
|
||||
*** 362,368 ****
|
||||
// This could happen if there is more than one XML 'next' tag.
|
||||
throw 'Next statement is already connected.';
|
||||
}
|
||||
- blockChild = Blockly.Xml.domToBlock(workspace, firstRealGrandchild,
|
||||
opt_reuseBlock);
|
||||
if (!blockChild.previousConnection) {
|
||||
throw 'Next block does not have previous statement.';
|
||||
--- 435,441 ----
|
||||
// This could happen if there is more than one XML 'next' tag.
|
||||
throw 'Next statement is already connected.';
|
||||
}
|
||||
+ blockChild = Blockly.Xml.domToBlockInner(workspace, firstRealGrandchild,
|
||||
opt_reuseBlock);
|
||||
if (!blockChild.previousConnection) {
|
||||
throw 'Next block does not have previous statement.';
|
||||
@@ -3,7 +3,7 @@
|
||||
# Code shared by translation conversion scripts.
|
||||
#
|
||||
# Copyright 2013 Google Inc.
|
||||
# https://blockly.googlecode.com/
|
||||
# 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.
|
||||
@@ -61,7 +61,7 @@ def read_json_file(filename):
|
||||
return defs
|
||||
except ValueError, e:
|
||||
print('Error reading ' + filename)
|
||||
raise InputError(file, str(e))
|
||||
raise InputError(filename, str(e))
|
||||
|
||||
|
||||
def _create_qqq_file(output_dir):
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# Generate .js files defining Blockly core and language messages.
|
||||
#
|
||||
# Copyright 2013 Google Inc.
|
||||
# https://blockly.googlecode.com/
|
||||
# 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.
|
||||
@@ -28,6 +28,14 @@ from common import read_json_file
|
||||
_NEWLINE_PATTERN = re.compile('[\n\r]')
|
||||
|
||||
|
||||
def string_is_ascii(s):
|
||||
try:
|
||||
s.decode('ascii')
|
||||
return True
|
||||
except UnicodeEncodeError:
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
"""Generate .js files defining Blockly core and language messages."""
|
||||
|
||||
@@ -76,10 +84,17 @@ def main():
|
||||
target_lang = filename[:filename.index('.')]
|
||||
if target_lang not in ('qqq', 'keys', 'synonyms'):
|
||||
target_defs = read_json_file(os.path.join(os.curdir, arg_file))
|
||||
|
||||
# Verify that keys are 'ascii'
|
||||
bad_keys = [key for key in target_defs if not string_is_ascii(key)]
|
||||
if bad_keys:
|
||||
print(u'These keys in {0} contain non ascii characters: {1}'.format(
|
||||
filename, ', '.join(bad_keys)))
|
||||
|
||||
# If there's a '\n' or '\r', remove it and print a warning.
|
||||
for key, value in target_defs.items():
|
||||
if _NEWLINE_PATTERN.search(value):
|
||||
print('WARNING: definition of {0} in {1} contained '
|
||||
print(u'WARNING: definition of {0} in {1} contained '
|
||||
'a newline character.'.
|
||||
format(key, arg_file))
|
||||
target_defs[key] = _NEWLINE_PATTERN.sub(' ', value)
|
||||
@@ -118,10 +133,10 @@ goog.require('Blockly.Msg');
|
||||
synonym_keys = [key for key in target_defs if key in synonym_defs]
|
||||
if not args.quiet:
|
||||
if extra_keys:
|
||||
print('These extra keys appeared in {0}: {1}'.format(
|
||||
print(u'These extra keys appeared in {0}: {1}'.format(
|
||||
filename, ', '.join(extra_keys)))
|
||||
if synonym_keys:
|
||||
print('These synonym keys appeared in {0}: {1}'.format(
|
||||
print(u'These synonym keys appeared in {0}: {1}'.format(
|
||||
filename, ', '.join(synonym_keys)))
|
||||
|
||||
outfile.write(synonym_text)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
# output.
|
||||
#
|
||||
# Copyright 2013 Google Inc.
|
||||
# https://blockly.googlecode.com/
|
||||
# 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.
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# Gives the translation status of the specified apps and languages.
|
||||
#
|
||||
# Copyright 2013 Google Inc.
|
||||
# https://blockly.googlecode.com/
|
||||
# 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.
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# Converts .json files into .js files for use within Blockly apps.
|
||||
#
|
||||
# Copyright 2013 Google Inc.
|
||||
# https://blockly.googlecode.com/
|
||||
# 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.
|
||||
|
||||
247
i18n/status.py
@@ -1,247 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
# Gives the translation status of the specified apps and languages.
|
||||
#
|
||||
# Copyright 2013 Google Inc.
|
||||
# https://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.
|
||||
|
||||
"""Produce a table showing the translation status of each app by language.
|
||||
|
||||
@author Ellen Spertus (ellen.spertus@gmail.com)
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import os
|
||||
from common import read_json_file
|
||||
|
||||
# Bogus language name representing all messages defined.
|
||||
TOTAL = 'qqq'
|
||||
|
||||
# List of key prefixes, which are app names, except for 'Apps', which
|
||||
# has common messages. It is included here for convenience.
|
||||
APPS = ['Apps', 'Code', 'Graph', 'Maze', 'Plane', 'Puzzle', 'Turtle']
|
||||
|
||||
|
||||
def get_prefix(s):
|
||||
"""Gets the portion of a string before the first period.
|
||||
|
||||
Args:
|
||||
s: A string.
|
||||
|
||||
Returns:
|
||||
The portion of the string before the first period, or the entire
|
||||
string if it does not contain a period.
|
||||
"""
|
||||
return s.split('.')[0]
|
||||
|
||||
|
||||
def get_prefix_count(prefix, arr):
|
||||
"""Counts how many strings in the array start with the prefix.
|
||||
|
||||
Args:
|
||||
prefix: The prefix string.
|
||||
arr: An array of strings.
|
||||
Returns:
|
||||
The number of strings in arr starting with prefix.
|
||||
"""
|
||||
# This code was chosen for its elegance not its efficiency.
|
||||
return len([elt for elt in arr if elt.startswith(prefix)])
|
||||
|
||||
|
||||
def output_as_html(messages, apps, verbose):
|
||||
"""Outputs the given prefix counts and percentages as HTML.
|
||||
|
||||
Specifically, a sortable HTML table is produced, where the app names
|
||||
are column headers, and one language is output per row. Entries
|
||||
are color-coded based on the percent completeness.
|
||||
|
||||
Args:
|
||||
messages: A dictionary of dictionaries, where the outer keys are language
|
||||
codes used by translatewiki (generally, ISO 639 language codes) or
|
||||
the string TOTAL, used to indicate the total set of messages. The
|
||||
inner dictionary makes message keys to values in that language.
|
||||
apps: Apps to consider.
|
||||
verbose: Whether to list missing keys.
|
||||
"""
|
||||
def generate_language_url(lang):
|
||||
return 'https://translatewiki.net/wiki/Special:SupportedLanguages#' + lang
|
||||
|
||||
def generate_number_as_percent(num, total, tag):
|
||||
percent = num * 100 / total
|
||||
if percent == 100:
|
||||
color = 'green'
|
||||
elif percent >= 90:
|
||||
color = 'orange'
|
||||
elif percent >= 60:
|
||||
color = 'black'
|
||||
else:
|
||||
color = 'gray'
|
||||
s = '<font color={0}>{1} ({2}%)</font>'.format(color, num, percent)
|
||||
if verbose and percent < 100:
|
||||
return '<a href="#{0}">{1}'.format(tag, s)
|
||||
else:
|
||||
return s
|
||||
|
||||
print('<head><title>Blockly app translation status</title></head><body>')
|
||||
print("<SCRIPT LANGUAGE='JavaScript1.2' SRC='https://neil.fraser.name/"
|
||||
"software/tablesort/tablesort-min.js'></SCRIPT>")
|
||||
print('<table cellspacing=5><thead><tr>')
|
||||
print('<th class=nocase>Language</th><th class=num>' +
|
||||
'</th><th class=num>'.join(apps) + '</th></tr></thead><tbody>')
|
||||
for lang in messages:
|
||||
if lang != TOTAL:
|
||||
print('<tr><td><a href="{1}">{0}</a></td>'.format(
|
||||
lang, generate_language_url(lang)))
|
||||
for app in apps:
|
||||
print '<td>'
|
||||
print(generate_number_as_percent(
|
||||
get_prefix_count(app, messages[lang]),
|
||||
get_prefix_count(app, messages[TOTAL]),
|
||||
(lang + app)))
|
||||
print '</td>'
|
||||
print('</tr>')
|
||||
print('</tbody><tfoot><tr><td>ALL</td><td>')
|
||||
print('</td><td>'.join([str(get_prefix_count(app, TOTAL)) for app in apps]))
|
||||
print('</td></tr></tfoot></table>')
|
||||
|
||||
if verbose:
|
||||
for lang in messages:
|
||||
if lang != TOTAL:
|
||||
for app in apps:
|
||||
if (get_prefix_count(app, messages[lang]) <
|
||||
get_prefix_count(app, messages[TOTAL])):
|
||||
print('<div id={0}{1}><strong>{1} (<a href="{2}">{0}</a>)'.
|
||||
format(lang, app, generate_language_url(lang)))
|
||||
print('</strong> missing: ')
|
||||
print(', '.join(
|
||||
[key for key in messages[TOTAL] if
|
||||
key.startswith(app) and key not in messages[lang]]))
|
||||
print('<br><br></div>')
|
||||
print('</body>')
|
||||
|
||||
|
||||
def output_as_text(messages, apps, verbose):
|
||||
"""Outputs the given prefix counts and percentages as text.
|
||||
|
||||
Args:
|
||||
messages: A dictionary of dictionaries, where the outer keys are language
|
||||
codes used by translatewiki (generally, ISO 639 language codes) or
|
||||
the string TOTAL, used to indicate the total set of messages. The
|
||||
inner dictionary makes message keys to values in that language.
|
||||
apps: Apps to consider.
|
||||
verbose: Whether to list missing keys.
|
||||
"""
|
||||
def generate_number_as_percent(num, total):
|
||||
return '{0} ({1}%)'.format(num, num * 100 / total)
|
||||
MAX_WIDTH = len('999 (100%)') + 1
|
||||
FIELD_STRING = '{0: <' + str(MAX_WIDTH) + '}'
|
||||
print(FIELD_STRING.format('Language') + ''.join(
|
||||
[FIELD_STRING.format(app) for app in apps]))
|
||||
print(('-' * (MAX_WIDTH - 1) + ' ') * (len(apps) + 1))
|
||||
for lang in messages:
|
||||
if lang != TOTAL:
|
||||
print(FIELD_STRING.format(lang) +
|
||||
''.join([FIELD_STRING.format(generate_number_as_percent(
|
||||
get_prefix_count(app, messages[lang]),
|
||||
get_prefix_count(app, messages[TOTAL])))
|
||||
for app in apps]))
|
||||
print(FIELD_STRING.format(TOTAL) +
|
||||
''.join(
|
||||
[FIELD_STRING.format(get_prefix_count(app, messages[TOTAL]))
|
||||
for app in apps]))
|
||||
if verbose:
|
||||
for lang in messages:
|
||||
if lang != TOTAL:
|
||||
for app in apps:
|
||||
missing = [key for key in messages[TOTAL]
|
||||
if key.startswith(app) and key not in messages[lang]]
|
||||
print('{0} {1}: Missing: {2}'.format(
|
||||
app.upper(), lang, (', '.join(missing) if missing else 'none')))
|
||||
|
||||
|
||||
def output_as_csv(messages, apps):
|
||||
"""Outputs the given prefix counts and percentages as CSV.
|
||||
|
||||
Args:
|
||||
messages: A dictionary of dictionaries, where the outer keys are language
|
||||
codes used by translatewiki (generally, ISO 639 language codes) or
|
||||
the string TOTAL, used to indicate the total set of messages. The
|
||||
inner dictionary makes message keys to values in that language.
|
||||
apps: Apps to consider.
|
||||
"""
|
||||
# Header row.
|
||||
print('Language, ' + ', ,'.join(apps))
|
||||
|
||||
# Total row.
|
||||
# Put at top, rather than bottom, so it can be frozen.
|
||||
print('TOTAL, ' + ', '.join(
|
||||
[str(get_prefix_count(app, messages[TOTAL])) + ', '
|
||||
for app in apps]))
|
||||
|
||||
# One line per language.
|
||||
for lang in messages:
|
||||
if lang != TOTAL:
|
||||
print(lang + ', ' + ', '.join(
|
||||
[str(get_prefix_count(app, messages[lang]))
|
||||
+ ', '
|
||||
+ str((get_prefix_count(app, messages[lang]) * 1.0 /
|
||||
get_prefix_count(app, messages[TOTAL])))
|
||||
for app in apps]))
|
||||
|
||||
|
||||
def main():
|
||||
"""Processes input files and outputs results in specified format.
|
||||
"""
|
||||
# Argument parsing.
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Display translation status by app and language.')
|
||||
parser.add_argument('--key_file', default='json' + os.path.sep + 'keys.json',
|
||||
help='file with complete list of keys.')
|
||||
parser.add_argument('--output', default='text',
|
||||
choices=['text', 'html', 'csv'],
|
||||
help='output format')
|
||||
parser.add_argument('--verbose', action='store_true', default=False,
|
||||
help='whether to indicate which messages were translated '
|
||||
'(only used in text and html output modes)')
|
||||
parser.add_argument('--app', default=None, choices=APPS,
|
||||
help='if set, only consider the specified app (prefix).')
|
||||
parser.add_argument('lang_files', nargs='+',
|
||||
help='names of JSON files to examine')
|
||||
args = parser.parse_args()
|
||||
apps = [args.app] if args.app else APPS
|
||||
|
||||
|
||||
# Read in JSON files.
|
||||
messages = {} # A dictionary of dictionaries.
|
||||
messages[TOTAL] = read_json_file(args.key_file)
|
||||
for lang_file in args.lang_files:
|
||||
prefix = get_prefix(os.path.split(lang_file)[1])
|
||||
# Skip non-language files.
|
||||
if prefix not in ['qqq', 'keys']:
|
||||
messages[prefix] = read_json_file(lang_file)
|
||||
|
||||
# Output results.
|
||||
if args.output == 'text':
|
||||
output_as_text(messages, apps, args.verbose)
|
||||
elif args.output == 'html':
|
||||
output_as_html(messages, apps, args.verbose)
|
||||
elif args.output == 'csv':
|
||||
output_as_csv(messages, apps)
|
||||
else:
|
||||
print('No output?!')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -4,7 +4,7 @@
|
||||
# Tests of i18n scripts.
|
||||
#
|
||||
# Copyright 2013 Google Inc.
|
||||
# https://blockly.googlecode.com/
|
||||
# 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.
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# Converts .xlf files into .json files for use at http://translatewiki.net.
|
||||
#
|
||||
# Copyright 2013 Google Inc.
|
||||
# https://blockly.googlecode.com/
|
||||
# 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.
|
||||
|
||||
BIN
media/anon.jpeg
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 19 KiB |
@@ -1,255 +0,0 @@
|
||||
.blocklySvg {
|
||||
background-color: #fff;
|
||||
}
|
||||
.blocklyWidgetDiv {
|
||||
position: absolute;
|
||||
display: none;
|
||||
z-index: 999;
|
||||
}
|
||||
.blocklyDraggable {
|
||||
cursor: url(handopen.cur) 8 5 , auto;
|
||||
}
|
||||
.blocklyResizeSE {
|
||||
fill: #aaa;
|
||||
cursor: se-resize;
|
||||
}
|
||||
.blocklyResizeSW {
|
||||
fill: #aaa;
|
||||
cursor: sw-resize;
|
||||
}
|
||||
.blocklyResizeLine {
|
||||
stroke-width: 1;
|
||||
stroke: #888;
|
||||
}
|
||||
.blocklyHighlightedConnectionPath {
|
||||
stroke-width: 4px;
|
||||
stroke: #fc3;
|
||||
fill: none;
|
||||
}
|
||||
.blocklyPathLight {
|
||||
fill: none;
|
||||
stroke-width: 2;
|
||||
stroke-linecap: round;
|
||||
}
|
||||
.blocklySelected>.blocklyPath {
|
||||
stroke-width: 3px;
|
||||
stroke: #fc3;
|
||||
}
|
||||
.blocklySelected>.blocklyPathLight {
|
||||
display: none;
|
||||
}
|
||||
.blocklyDragging>.blocklyPath, .blocklyDragging>.blocklyPathLight {
|
||||
fill-opacity: .8;
|
||||
stroke-opacity: .8;
|
||||
}
|
||||
.blocklyDragging>.blocklyPathDark {
|
||||
display: none;
|
||||
}
|
||||
.blocklyDisabled>.blocklyPath {
|
||||
fill-opacity: .5;
|
||||
stroke-opacity: .5;
|
||||
}
|
||||
.blocklyDisabled>.blocklyPathLight, .blocklyDisabled>.blocklyPathDark {
|
||||
display: none;
|
||||
}
|
||||
.blocklyText {
|
||||
cursor: default;
|
||||
font-family: sans-serif;
|
||||
font-size: 11pt;
|
||||
fill: #fff;
|
||||
}
|
||||
.blocklyNonEditableText>text {
|
||||
pointer-events: none;
|
||||
}
|
||||
.blocklyNonEditableText>rect, .blocklyEditableText>rect {
|
||||
fill: #fff;
|
||||
fill-opacity: .6;
|
||||
}
|
||||
.blocklyNonEditableText>text, .blocklyEditableText>text {
|
||||
fill: #000;
|
||||
}
|
||||
.blocklyEditableText:hover>rect {
|
||||
stroke-width: 2;
|
||||
stroke: #fff;
|
||||
}
|
||||
.blocklySvg text {
|
||||
-moz-user-select: none;
|
||||
-webkit-user-select: none;
|
||||
user-select: none;
|
||||
cursor: inherit;
|
||||
}
|
||||
.blocklyHidden {
|
||||
display: none;
|
||||
}
|
||||
.blocklyTooltipBackground {
|
||||
fill: #ffffc7;
|
||||
stroke-width: 1px;
|
||||
stroke: #d8d8d8;
|
||||
}
|
||||
.blocklyTooltipShadow, .blocklyContextMenuShadow, .blocklyDropdownMenuShadow {
|
||||
fill: #bbb;
|
||||
filter: url(#blocklyShadowFilter);
|
||||
}
|
||||
.blocklyTooltipText {
|
||||
font-family: sans-serif;
|
||||
font-size: 9pt;
|
||||
fill: #000;
|
||||
}
|
||||
.blocklyIconShield {
|
||||
cursor: default;
|
||||
fill: #00c;
|
||||
stroke-width: 1px;
|
||||
stroke: #ccc;
|
||||
}
|
||||
.blocklyIconGroup:hover>.blocklyIconShield {
|
||||
fill: #00f;
|
||||
stroke: #fff;
|
||||
}
|
||||
.blocklyIconGroup:hover>.blocklyIconMark {
|
||||
fill: #fff;
|
||||
}
|
||||
.blocklyIconMark {
|
||||
cursor: default !important;
|
||||
font-family: sans-serif;
|
||||
font-size: 9pt;
|
||||
font-weight: bold;
|
||||
fill: #ccc;
|
||||
text-anchor: middle;
|
||||
}
|
||||
.blocklyMinimalBody {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.blocklyCommentTextarea {
|
||||
margin: 0;
|
||||
padding: 2px;
|
||||
border: 0;
|
||||
resize: none;
|
||||
background-color: #ffc;
|
||||
}
|
||||
.blocklyHtmlInput {
|
||||
font-family: sans-serif;
|
||||
font-size: 11pt;
|
||||
border: none;
|
||||
outline: none;
|
||||
}
|
||||
.blocklyContextMenuBackground, .blocklyMutatorBackground {
|
||||
fill: #fff;
|
||||
stroke-width: 1;
|
||||
stroke: #ddd;
|
||||
}
|
||||
.blocklyContextMenuOptions>.blocklyMenuDiv, .blocklyContextMenuOptions>.blocklyMenuDivDisabled, .blocklyDropdownMenuOptions>.blocklyMenuDiv {
|
||||
fill: #fff;
|
||||
}
|
||||
.blocklyToolboxOptions>.blocklyMenuDiv {
|
||||
fill: #ddd;
|
||||
}
|
||||
.blocklyToolboxOptions>.blocklyMenuDiv:hover {
|
||||
fill: #e4e4e4;
|
||||
}
|
||||
.blocklyContextMenuOptions>.blocklyMenuDiv:hover>rect, .blocklyDropdownMenuOptions>.blocklyMenuDiv:hover>rect, .blocklyMenuSelected>rect {
|
||||
fill: #57e;
|
||||
}
|
||||
.blocklyMenuText {
|
||||
cursor: default !important;
|
||||
font-family: sans-serif;
|
||||
font-size: 15px;
|
||||
fill: #000;
|
||||
}
|
||||
.blocklyContextMenuOptions>.blocklyMenuDiv:hover>.blocklyMenuText, .blocklyDropdownMenuOptions>.blocklyMenuDiv:hover>.blocklyMenuText, .blocklyMenuSelected>.blocklyMenuText {
|
||||
fill: #fff;
|
||||
}
|
||||
.blocklyMenuDivDisabled>.blocklyMenuText {
|
||||
fill: #ccc;
|
||||
}
|
||||
.blocklyToolboxBackground {
|
||||
fill: #ddd;
|
||||
}
|
||||
.blocklyFlyoutBackground {
|
||||
fill: #ddd;
|
||||
fill-opacity: .8;
|
||||
}
|
||||
.blocklyColourBackground {
|
||||
fill: #666;
|
||||
}
|
||||
.blocklyScrollbarBackground {
|
||||
fill: #fff;
|
||||
stroke-width: 1;
|
||||
stroke: #e4e4e4;
|
||||
}
|
||||
.blocklyScrollbarKnob {
|
||||
fill: #ccc;
|
||||
}
|
||||
.blocklyScrollbarBackground:hover+.blocklyScrollbarKnob, .blocklyScrollbarKnob:hover {
|
||||
fill: #bbb;
|
||||
}
|
||||
.blocklyInvalidInput {
|
||||
background: #faa;
|
||||
}
|
||||
.goog-palette {
|
||||
outline: none;
|
||||
cursor: default;
|
||||
}
|
||||
.goog-palette-table {
|
||||
border: 1px solid #666;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.goog-palette-cell {
|
||||
height: 13px;
|
||||
width: 15px;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
border-right: 1px solid #666;
|
||||
font-size: 1px;
|
||||
}
|
||||
.goog-palette-colorswatch {
|
||||
position: relative;
|
||||
height: 13px;
|
||||
width: 15px;
|
||||
border: 1px solid #666;
|
||||
}
|
||||
.goog-palette-cell-hover .goog-palette-colorswatch {
|
||||
border: 1px solid #fff;
|
||||
}
|
||||
.goog-palette-cell-selected .goog-palette-colorswatch {
|
||||
border: 1px solid #000;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
|
||||
.blocklyErrorIconShield {
|
||||
cursor: default;
|
||||
fill: #f00;
|
||||
stroke-width: 1px;
|
||||
stroke: #ccc;
|
||||
}
|
||||
.blocklyIconGroup:hover>.blocklyErrorIconShield {
|
||||
fill: #f00;
|
||||
stroke: #fff;
|
||||
}
|
||||
|
||||
.blocklyWarningIconShield {
|
||||
cursor: default;
|
||||
fill: #ff5;
|
||||
stroke-width: 1px;
|
||||
stroke: #555;
|
||||
}
|
||||
.blocklyIconGroup:hover>.blocklyWarningIconShield {
|
||||
fill: #ff0;
|
||||
stroke: #000;
|
||||
}
|
||||
|
||||
.blocklyWarningIconMark {
|
||||
cursor: default !important;
|
||||
font-family: sans-serif;
|
||||
font-size: 9pt;
|
||||
font-weight: bold;
|
||||
fill: #555;
|
||||
text-anchor: middle;
|
||||
}
|
||||
|
||||
.blocklyIconGroup:hover>.blocklyWarningIconMark {
|
||||
fill: #000;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 19 KiB |