in generators/javascript/text.js [180:254]
Blockly.JavaScript['text_getSubstring'] = function(block) {
// Get substring.
var where1 = block.getFieldValue('WHERE1');
var where2 = block.getFieldValue('WHERE2');
var requiresLengthCall = (where1 != 'FROM_END' && where1 != 'LAST' &&
where2 != 'FROM_END' && where2 != 'LAST');
var textOrder = requiresLengthCall ? Blockly.JavaScript.ORDER_MEMBER :
Blockly.JavaScript.ORDER_NONE;
var text = Blockly.JavaScript.valueToCode(block, 'STRING',
textOrder) || '\'\'';
if (where1 == 'FIRST' && where2 == 'LAST') {
var code = text;
return [code, Blockly.JavaScript.ORDER_NONE];
} else if (text.match(/^'?\w+'?$/) || requiresLengthCall) {
// 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 Error('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 Error('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];
};