| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * @fileoverview Translates text to braille, optionally with some parts | 6 * @fileoverview Translates text to braille, optionally with some parts |
| 7 * uncontracted. | 7 * uncontracted. |
| 8 */ | 8 */ |
| 9 | 9 |
| 10 goog.provide('cvox.ExpandingBrailleTranslator'); | 10 goog.provide('cvox.ExpandingBrailleTranslator'); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 * for all other text. When determining what text to use uncontracted | 26 * for all other text. When determining what text to use uncontracted |
| 27 * translation for around a position, a region surrounding that position | 27 * translation for around a position, a region surrounding that position |
| 28 * containing either only whitespace characters or only non-whitespace | 28 * containing either only whitespace characters or only non-whitespace |
| 29 * characters is used. | 29 * characters is used. |
| 30 * @param {!cvox.LibLouis.Translator} defaultTranslator The translator for all | 30 * @param {!cvox.LibLouis.Translator} defaultTranslator The translator for all |
| 31 * text when the uncontracted translator is not used. | 31 * text when the uncontracted translator is not used. |
| 32 * @param {cvox.LibLouis.Translator=} opt_uncontractedTranslator | 32 * @param {cvox.LibLouis.Translator=} opt_uncontractedTranslator |
| 33 * Translator to use for uncontracted braille translation. | 33 * Translator to use for uncontracted braille translation. |
| 34 * @constructor | 34 * @constructor |
| 35 */ | 35 */ |
| 36 cvox.ExpandingBrailleTranslator = | 36 cvox.ExpandingBrailleTranslator = function( |
| 37 function(defaultTranslator, opt_uncontractedTranslator) { | 37 defaultTranslator, opt_uncontractedTranslator) { |
| 38 /** | 38 /** |
| 39 * @type {!cvox.LibLouis.Translator} | 39 * @type {!cvox.LibLouis.Translator} |
| 40 * @private | 40 * @private |
| 41 */ | 41 */ |
| 42 this.defaultTranslator_ = defaultTranslator; | 42 this.defaultTranslator_ = defaultTranslator; |
| 43 /** | 43 /** |
| 44 * @type {cvox.LibLouis.Translator} | 44 * @type {cvox.LibLouis.Translator} |
| 45 * @private | 45 * @private |
| 46 */ | 46 */ |
| 47 this.uncontractedTranslator_ = opt_uncontractedTranslator || null; | 47 this.uncontractedTranslator_ = opt_uncontractedTranslator || null; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 /** | 79 /** |
| 80 * Translates text to braille using the translator(s) provided to the | 80 * Translates text to braille using the translator(s) provided to the |
| 81 * constructor. See {@code cvox.LibLouis.Translator} for further details. | 81 * constructor. See {@code cvox.LibLouis.Translator} for further details. |
| 82 * @param {!Spannable} text Text to translate. | 82 * @param {!Spannable} text Text to translate. |
| 83 * @param {cvox.ExpandingBrailleTranslator.ExpansionType} expansionType | 83 * @param {cvox.ExpandingBrailleTranslator.ExpansionType} expansionType |
| 84 * Indicates how the text marked by a value span, if any, is expanded. | 84 * Indicates how the text marked by a value span, if any, is expanded. |
| 85 * @param {function(!ArrayBuffer, !Array<number>, !Array<number>)} | 85 * @param {function(!ArrayBuffer, !Array<number>, !Array<number>)} |
| 86 * callback Called when the translation is done. It takes resulting | 86 * callback Called when the translation is done. It takes resulting |
| 87 * braille cells and positional mappings as parameters. | 87 * braille cells and positional mappings as parameters. |
| 88 */ | 88 */ |
| 89 cvox.ExpandingBrailleTranslator.prototype.translate = | 89 cvox.ExpandingBrailleTranslator.prototype.translate = function( |
| 90 function(text, expansionType, callback) { | 90 text, expansionType, callback) { |
| 91 var expandRanges = this.findExpandRanges_(text, expansionType); | 91 var expandRanges = this.findExpandRanges_(text, expansionType); |
| 92 var extraCellsSpans = text.getSpansInstanceOf(cvox.ExtraCellsSpan) | 92 var extraCellsSpans = |
| 93 .filter(function(span) { return span.cells.byteLength > 0;}); | 93 text.getSpansInstanceOf(cvox.ExtraCellsSpan).filter(function(span) { |
| 94 return span.cells.byteLength > 0; |
| 95 }); |
| 94 var extraCellsPositions = extraCellsSpans.map(function(span) { | 96 var extraCellsPositions = extraCellsSpans.map(function(span) { |
| 95 return text.getSpanStart(span); | 97 return text.getSpanStart(span); |
| 96 }); | 98 }); |
| 97 if (expandRanges.length == 0 && extraCellsSpans.length == 0) { | 99 if (expandRanges.length == 0 && extraCellsSpans.length == 0) { |
| 98 this.defaultTranslator_.translate( | 100 this.defaultTranslator_.translate( |
| 99 text.toString(), | 101 text.toString(), |
| 100 cvox.ExpandingBrailleTranslator.nullParamsToEmptyAdapter_( | 102 cvox.ExpandingBrailleTranslator.nullParamsToEmptyAdapter_( |
| 101 text.length, callback)); | 103 text.length, callback)); |
| 102 return; | 104 return; |
| 103 } | 105 } |
| 104 | 106 |
| 105 var chunks = []; | 107 var chunks = []; |
| 106 function maybeAddChunkToTranslate(translator, start, end) { | 108 function maybeAddChunkToTranslate(translator, start, end) { |
| 107 if (start < end) | 109 if (start < end) |
| 108 chunks.push({translator: translator, start: start, end: end}); | 110 chunks.push({translator: translator, start: start, end: end}); |
| 109 } | 111 } |
| 110 function addExtraCellsChunk(pos, cells) { | 112 function addExtraCellsChunk(pos, cells) { |
| 111 var chunk = {translator: null, | 113 var chunk = { |
| 112 start: pos, | 114 translator: null, |
| 113 end: pos, | 115 start: pos, |
| 114 cells: cells, | 116 end: pos, |
| 115 textToBraille: [], | 117 cells: cells, |
| 116 brailleToText: new Array(cells.byteLength)}; | 118 textToBraille: [], |
| 119 brailleToText: new Array(cells.byteLength) |
| 120 }; |
| 117 for (var i = 0; i < cells.byteLength; ++i) | 121 for (var i = 0; i < cells.byteLength; ++i) |
| 118 chunk.brailleToText[i] = 0; | 122 chunk.brailleToText[i] = 0; |
| 119 chunks.push(chunk); | 123 chunks.push(chunk); |
| 120 } | 124 } |
| 121 function addChunk(translator, start, end) { | 125 function addChunk(translator, start, end) { |
| 122 while (extraCellsSpans.length > 0 && extraCellsPositions[0] <= end) { | 126 while (extraCellsSpans.length > 0 && extraCellsPositions[0] <= end) { |
| 123 maybeAddChunkToTranslate(translator, start, extraCellsPositions[0]); | 127 maybeAddChunkToTranslate(translator, start, extraCellsPositions[0]); |
| 124 start = extraCellsPositions.shift(); | 128 start = extraCellsPositions.shift(); |
| 125 addExtraCellsChunk(start, extraCellsSpans.shift().cells); | 129 addExtraCellsChunk(start, extraCellsSpans.shift().cells); |
| 126 } | 130 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 144 | 148 |
| 145 function chunkTranslated(chunk, cells, textToBraille, brailleToText) { | 149 function chunkTranslated(chunk, cells, textToBraille, brailleToText) { |
| 146 chunk.cells = cells; | 150 chunk.cells = cells; |
| 147 chunk.textToBraille = textToBraille; | 151 chunk.textToBraille = textToBraille; |
| 148 chunk.brailleToText = brailleToText; | 152 chunk.brailleToText = brailleToText; |
| 149 if (--numPendingCallbacks <= 0) | 153 if (--numPendingCallbacks <= 0) |
| 150 finish(); | 154 finish(); |
| 151 } | 155 } |
| 152 | 156 |
| 153 function finish() { | 157 function finish() { |
| 154 var totalCells = chunks.reduce( | 158 var totalCells = chunks.reduce(function(accum, chunk) { |
| 155 function(accum, chunk) { return accum + chunk.cells.byteLength;}, 0); | 159 return accum + chunk.cells.byteLength; |
| 160 }, 0); |
| 156 var cells = new Uint8Array(totalCells); | 161 var cells = new Uint8Array(totalCells); |
| 157 var cellPos = 0; | 162 var cellPos = 0; |
| 158 var textToBraille = []; | 163 var textToBraille = []; |
| 159 var brailleToText = []; | 164 var brailleToText = []; |
| 160 function appendAdjusted(array, toAppend, adjustment) { | 165 function appendAdjusted(array, toAppend, adjustment) { |
| 161 array.push.apply(array, toAppend.map( | 166 array.push.apply(array, toAppend.map(function(elem) { |
| 162 function(elem) { return adjustment + elem; } | 167 return adjustment + elem; |
| 163 )); | 168 })); |
| 164 } | 169 } |
| 165 for (var i = 0, chunk; chunk = chunks[i]; ++i) { | 170 for (var i = 0, chunk; chunk = chunks[i]; ++i) { |
| 166 cells.set(new Uint8Array(chunk.cells), cellPos); | 171 cells.set(new Uint8Array(chunk.cells), cellPos); |
| 167 appendAdjusted(textToBraille, chunk.textToBraille, cellPos); | 172 appendAdjusted(textToBraille, chunk.textToBraille, cellPos); |
| 168 appendAdjusted(brailleToText, chunk.brailleToText, chunk.start); | 173 appendAdjusted(brailleToText, chunk.brailleToText, chunk.start); |
| 169 cellPos += chunk.cells.byteLength; | 174 cellPos += chunk.cells.byteLength; |
| 170 } | 175 } |
| 171 callback(cells.buffer, textToBraille, brailleToText); | 176 callback(cells.buffer, textToBraille, brailleToText); |
| 172 } | 177 } |
| 173 | 178 |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 * Adapts {@code callback} to accept null arguments and treat them as if the | 314 * Adapts {@code callback} to accept null arguments and treat them as if the |
| 310 * translation result is empty. | 315 * translation result is empty. |
| 311 * @param {number} inputLength Length of the input to the translation. | 316 * @param {number} inputLength Length of the input to the translation. |
| 312 * Used for populating {@code textToBraille} if null. | 317 * Used for populating {@code textToBraille} if null. |
| 313 * @param {function(!ArrayBuffer, !Array<number>, !Array<number>)} callback | 318 * @param {function(!ArrayBuffer, !Array<number>, !Array<number>)} callback |
| 314 * The callback to adapt. | 319 * The callback to adapt. |
| 315 * @return {function(ArrayBuffer, Array<number>, Array<number>)} | 320 * @return {function(ArrayBuffer, Array<number>, Array<number>)} |
| 316 * An adapted version of the callback. | 321 * An adapted version of the callback. |
| 317 * @private | 322 * @private |
| 318 */ | 323 */ |
| 319 cvox.ExpandingBrailleTranslator.nullParamsToEmptyAdapter_ = | 324 cvox.ExpandingBrailleTranslator.nullParamsToEmptyAdapter_ = function( |
| 320 function(inputLength, callback) { | 325 inputLength, callback) { |
| 321 return function(cells, textToBraille, brailleToText) { | 326 return function(cells, textToBraille, brailleToText) { |
| 322 if (!textToBraille) { | 327 if (!textToBraille) { |
| 323 textToBraille = new Array(inputLength); | 328 textToBraille = new Array(inputLength); |
| 324 for (var i = 0; i < inputLength; ++i) { | 329 for (var i = 0; i < inputLength; ++i) { |
| 325 textToBraille[i] = 0; | 330 textToBraille[i] = 0; |
| 326 } | 331 } |
| 327 } | 332 } |
| 328 callback(cells || new ArrayBuffer(0), | 333 callback(cells || new ArrayBuffer(0), textToBraille, brailleToText || []); |
| 329 textToBraille, | |
| 330 brailleToText || []); | |
| 331 }; | 334 }; |
| 332 }; | 335 }; |
| 333 | 336 |
| 334 | 337 |
| 335 /** | 338 /** |
| 336 * A character range with inclusive start and exclusive end positions. | 339 * A character range with inclusive start and exclusive end positions. |
| 337 * @typedef {{start: number, end: number}} | 340 * @typedef {{start: number, end: number}} |
| 338 * @private | 341 * @private |
| 339 */ | 342 */ |
| 340 cvox.ExpandingBrailleTranslator.Range_; | 343 cvox.ExpandingBrailleTranslator.Range_; |
| OLD | NEW |