From 0f93b3098f8649f541bc2bc2e7cf92b418ba28c3 Mon Sep 17 00:00:00 2001 From: Peter Xiao Date: Tue, 13 Aug 2013 15:34:22 -0700 Subject: [PATCH] Start merging tokens. --- lib/ace/ext/chromevox.js | 42 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/lib/ace/ext/chromevox.js b/lib/ace/ext/chromevox.js index 5ad8ba18..3243a7a6 100644 --- a/lib/ace/ext/chromevox.js +++ b/lib/ace/ext/chromevox.js @@ -275,6 +275,47 @@ var rules = { 'variable': VARIABLE_PROP }; +/** + * Merges tokens from start inclusive to end exclusive. + * @param {Array.} Tokens to be merged. + * @param {number} start Start index inclusive. + * @param {number} end End index exclusive. + * @return {cvoxAce.Token} Merged token. + */ +var mergeTokens = function(tokens, start, end) { + /* Different type of token found! Merge all previous like tokens. */ + var newToken = {}; + newToken.value = ''; + newToken.type = tokens[start].type; + for (var j = start; j < end; j++) { + newToken.value += tokens[j].value; + } + return newToken; +}; + +/** + * Merges tokens that use the same speech properties. + * @param {Array.} tokens Tokens to be merged. + * @return {Array.} Merged tokens. + */ +var mergeLikeTokens = function(tokens) { + if (tokens.length <= 1) { + return tokens; + } + var newTokens = []; + var lastLikeIndex = 0; + for (var i = 1; i < tokens.length; i++) { + var lastLikeToken = tokens[lastLikeIndex]; + var currToken = tokens[i]; + if (getTokenProp(lastLikeToken) !== getTokenProp(currToken)) { + newTokens.push(mergeTokens(tokens, lastLikeIndex, i)); + lastLikeIndex = i; + } + } + newTokens.push(mergeTokens(tokens, lastLikeIndex, tokens.length)); + return newTokens; +}; + /** * Speak the line with syntax properties. * @param {number} row Row to speak. @@ -285,6 +326,7 @@ var speakLine = function(row, queue) { if (tokens.length === 0) { return; } + tokens = mergeLikeTokens(tokens); var firstToken = tokens[0]; /* Filter out first token. */ tokens = tokens.filter(function(token) {