diff options
Diffstat (limited to 'chromium/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator.js')
-rw-r--r-- | chromium/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator.js | 56 |
1 files changed, 43 insertions, 13 deletions
diff --git a/chromium/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator.js b/chromium/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator.js index 24b28b42e34..18baad777cc 100644 --- a/chromium/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator.js +++ b/chromium/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator.js @@ -9,6 +9,7 @@ goog.provide('cvox.ExpandingBrailleTranslator'); +goog.require('cvox.ExtraCellsSpan'); goog.require('cvox.LibLouis'); goog.require('cvox.Spannable'); goog.require('cvox.ValueSelectionSpan'); @@ -88,7 +89,12 @@ cvox.ExpandingBrailleTranslator.ExpansionType = { cvox.ExpandingBrailleTranslator.prototype.translate = function(text, expansionType, callback) { var expandRanges = this.findExpandRanges_(text, expansionType); - if (expandRanges.length == 0) { + var extraCellsSpans = text.getSpansInstanceOf(cvox.ExtraCellsSpan) + .filter(function(span) { return span.cells.byteLength > 0;}); + var extraCellsPositions = extraCellsSpans.map(function(span) { + return text.getSpanStart(span); + }); + if (expandRanges.length == 0 && extraCellsSpans.length == 0) { this.defaultTranslator_.translate( text.toString(), cvox.ExpandingBrailleTranslator.nullParamsToEmptyAdapter_( @@ -97,8 +103,28 @@ cvox.ExpandingBrailleTranslator.prototype.translate = } var chunks = []; + function maybeAddChunkToTranslate(translator, start, end) { + if (start < end) + chunks.push({translator: translator, start: start, end: end}); + } + function addExtraCellsChunk(pos, cells) { + var chunk = {translator: null, + start: pos, + end: pos, + cells: cells, + textToBraille: [], + brailleToText: new Array(cells.byteLength)}; + for (var i = 0; i < cells.byteLength; ++i) + chunk.brailleToText[i] = 0; + chunks.push(chunk); + } function addChunk(translator, start, end) { - chunks.push({translator: translator, start: start, end: end}); + while (extraCellsSpans.length > 0 && extraCellsPositions[0] <= end) { + maybeAddChunkToTranslate(translator, start, extraCellsPositions[0]); + start = extraCellsPositions.shift(); + addExtraCellsChunk(start, extraCellsSpans.shift().cells); + } + maybeAddChunkToTranslate(translator, start, end); } var lastEnd = 0; for (var i = 0; i < expandRanges.length; ++i) { @@ -109,19 +135,19 @@ cvox.ExpandingBrailleTranslator.prototype.translate = addChunk(this.uncontractedTranslator_, range.start, range.end); lastEnd = range.end; } - if (lastEnd < text.getLength()) { - addChunk(this.defaultTranslator_, lastEnd, text.getLength()); - } + addChunk(this.defaultTranslator_, lastEnd, text.getLength()); - var numPendingCallbacks = chunks.length; + var chunksToTranslate = chunks.filter(function(chunk) { + return chunk.translator; + }); + var numPendingCallbacks = chunksToTranslate.length; function chunkTranslated(chunk, cells, textToBraille, brailleToText) { chunk.cells = cells; chunk.textToBraille = textToBraille; chunk.brailleToText = brailleToText; - if (--numPendingCallbacks <= 0) { + if (--numPendingCallbacks <= 0) finish(); - } } function finish() { @@ -145,11 +171,15 @@ cvox.ExpandingBrailleTranslator.prototype.translate = callback(cells.buffer, textToBraille, brailleToText); } - for (var i = 0, chunk; chunk = chunks[i]; ++i) { - chunk.translator.translate( - text.toString().substring(chunk.start, chunk.end), - cvox.ExpandingBrailleTranslator.nullParamsToEmptyAdapter_( - chunk.end - chunk.start, goog.partial(chunkTranslated, chunk))); + if (chunksToTranslate.length > 0) { + chunksToTranslate.forEach(function(chunk) { + chunk.translator.translate( + text.toString().substring(chunk.start, chunk.end), + cvox.ExpandingBrailleTranslator.nullParamsToEmptyAdapter_( + chunk.end - chunk.start, goog.partial(chunkTranslated, chunk))); + }); + } else { + finish(); } }; |