diff --git a/src/blocks/scratch3_looks.js b/src/blocks/scratch3_looks.js index a6da97f35..762cfa6ec 100644 --- a/src/blocks/scratch3_looks.js +++ b/src/blocks/scratch3_looks.js @@ -233,6 +233,26 @@ class Scratch3LooksBlocks { this._positionBubble(target); } + /** + * Properly format text for a text bubble. + * @param {string} text The text to be formatted + * @return {string} The formatted text + * @private + */ + _formatBubbleText (text) { + if (text === '') return text; + + // Limit decimal precision to 2 digits. + if (typeof text === 'number') { + text = parseFloat(text.toFixed(2)); + } + + // Limit the length of the string. + text = String(text).substr(0, Scratch3LooksBlocks.SAY_BUBBLE_LIMIT); + + return text; + } + /** * The entry point for say/think blocks. Clears existing bubble if the text is empty. * Set the bubble custom state and then call _renderBubble. @@ -244,7 +264,7 @@ class Scratch3LooksBlocks { _updateBubble (target, type, text) { const bubbleState = this._getBubbleState(target); bubbleState.type = type; - bubbleState.text = text; + bubbleState.text = this._formatBubbleText(text); bubbleState.usageId = uid(); this._renderBubble(target); } @@ -300,12 +320,7 @@ class Scratch3LooksBlocks { say (args, util) { // @TODO in 2.0 calling say/think resets the right/left bias of the bubble - let message = args.MESSAGE; - if (typeof message === 'number') { - message = parseFloat(message.toFixed(2)); - } - message = String(message).substr(0, Scratch3LooksBlocks.SAY_BUBBLE_LIMIT); - this.runtime.emit('SAY', util.target, 'say', message); + this.runtime.emit('SAY', util.target, 'say', args.MESSAGE); } sayforsecs (args, util) { @@ -325,7 +340,7 @@ class Scratch3LooksBlocks { } think (args, util) { - this._updateBubble(util.target, 'think', String(args.MESSAGE).substr(0, Scratch3LooksBlocks.SAY_BUBBLE_LIMIT)); + this.runtime.emit('SAY', util.target, 'think', args.MESSAGE); } thinkforsecs (args, util) { diff --git a/test/unit/blocks_looks.js b/test/unit/blocks_looks.js index 599e7e49a..487112ff2 100644 --- a/test/unit/blocks_looks.js +++ b/test/unit/blocks_looks.js @@ -15,7 +15,9 @@ const util = { {name: 'second name'}, {name: 'third name'} ] - } + }, + _customState: {}, + getCustomState: () => util.target._customState } }; @@ -202,14 +204,15 @@ test('numbers should be rounded to two decimals in say', t => { const args = {MESSAGE: 3.14159}; const expectedSayString = '3.14'; - rt.removeAllListeners('SAY'); // Prevent say blocks from executing - - rt.addListener('SAY', (target, type, sayString) => { - t.strictEqual(sayString, expectedSayString); - t.end(); + rt.addListener('SAY', () => { + const bubbleState = util.target.getCustomState(Looks.STATE_KEY); + t.strictEqual(bubbleState.text, expectedSayString); }); looks.say(args, util); + looks.think(args, util); + + t.end(); }); test('clamp graphic effects', t => {