Add lists_sort block.

This commit is contained in:
Dan LaLiberte
2016-05-04 17:03:24 -04:00
parent 7faafe0b6d
commit c1cfec8dbd
83 changed files with 3039 additions and 2161 deletions

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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',

View File

@@ -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');