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 |