mirror of
https://github.com/google/blockly.git
synced 2026-01-08 17:40:09 +01:00
Add lists_sort block.
This commit is contained in:
@@ -310,6 +310,34 @@ Blockly.Dart['lists_getSublist'] = function(block) {
|
||||
return [code, Blockly.Dart.ORDER_UNARY_POSTFIX];
|
||||
};
|
||||
|
||||
Blockly.Dart['lists_sort'] = function(block) {
|
||||
// Block for sorting a list.
|
||||
var listCode = Blockly.Dart.valueToCode(block, 'LIST',
|
||||
Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]';
|
||||
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 * ',
|
||||
' double.parse(a.toString()).compareTo(double.parse(b.toString())),',
|
||||
' "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 + '(' + listCode + ', ' +
|
||||
'"' + 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 value_input = Blockly.Dart.valueToCode(block, 'INPUT',
|
||||
|
||||
@@ -299,6 +299,34 @@ Blockly.JavaScript['lists_getSublist'] = function(block) {
|
||||
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
|
||||
};
|
||||
|
||||
Blockly.JavaScript['lists_sort'] = function(block) {
|
||||
// Block for sorting a list.
|
||||
var listCode = 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_(
|
||||
'lists_get_sort_compare',
|
||||
['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().localeCompare(b.toString(), "en"); },',
|
||||
' "IGNORE_CASE": function(a, b) {',
|
||||
' return a.toString().localeCompare(b.toString(), "en", ',
|
||||
' {"sensitivity": "base"}); },',
|
||||
' };',
|
||||
' var compare = compareFuncs[type];',
|
||||
' return function(a, b) { return compare(a, b) * direction; }',
|
||||
'}']);
|
||||
return ['(' + listCode + ').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 value_input = Blockly.JavaScript.valueToCode(block, 'INPUT',
|
||||
|
||||
@@ -320,6 +320,42 @@ Blockly.Lua['lists_getSublist'] = function(block) {
|
||||
return [code, Blockly.Lua.ORDER_HIGH];
|
||||
};
|
||||
|
||||
Blockly.Lua['lists_sort'] = function(block) {
|
||||
// Block for sorting a list.
|
||||
var listCode = Blockly.Lua.valueToCode(
|
||||
block, 'LIST', Blockly.Lua.ORDER_HIGH) || '({})';
|
||||
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 +
|
||||
'(' + listCode + ',"' + 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 value_input = Blockly.Lua.valueToCode(block, 'INPUT',
|
||||
|
||||
@@ -356,6 +356,34 @@ Blockly.PHP['lists_getSublist'] = function(block) {
|
||||
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_FUNCTION_CALL) || '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) {',
|
||||
' $sortFuncs = array(',
|
||||
' "NUMERIC" => "sort",',
|
||||
' "TEXT" => "natsort",',
|
||||
' "IGNORE_CASE" => "natcasesort"',
|
||||
' );',
|
||||
' $sort = $sortFuncs[$type];',
|
||||
' $list2 = $list;', // Clone list.
|
||||
' $sort($list2);',
|
||||
' 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',
|
||||
|
||||
@@ -312,6 +312,35 @@ Blockly.Python['lists_getSublist'] = function(block) {
|
||||
return [code, Blockly.Python.ORDER_MEMBER];
|
||||
};
|
||||
|
||||
Blockly.Python['lists_sort'] = function(block) {
|
||||
// Block for sorting a list.
|
||||
var listCode = (Blockly.Python.valueToCode(block, 'LIST',
|
||||
Blockly.Python.ORDER_MEMBER) || '[]');
|
||||
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_ +
|
||||
'(listv, type, reversev):',
|
||||
' def tryfloat(s):',
|
||||
' try:',
|
||||
' return float(s)',
|
||||
' except:',
|
||||
' return 0',
|
||||
' keyFuncts = {',
|
||||
' "NUMERIC": tryfloat,',
|
||||
' "TEXT": str,',
|
||||
' "IGNORE_CASE": lambda s: str(s).lower()',
|
||||
' }',
|
||||
' keyv = keyFuncts[type]',
|
||||
' tmp_list = list(listv)', // clone the list
|
||||
' return sorted(tmp_list, key=keyv, reverse=reversev)'
|
||||
]);
|
||||
|
||||
var code = sortFunctionName +
|
||||
'(' + listCode + ', "' + 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');
|
||||
|
||||
Reference in New Issue
Block a user