// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview Handles processing and displaying braille in the ChromeVox
* panel.
*/
class BrailleCaptions {
private brailleTableElement_ = $('braille-table') as HTMLTableElement;
private brailleTableElement2_ = $('braille-table2') as HTMLTableElement;
addBorders(cell: HTMLTableCellElement): void {
if (cell.tagName === 'TD') {
cell.className = 'highlighted-cell';
const companionIDs = cell.getAttribute('data-companionIDs');
companionIDs!.split(' ').forEach(
companionID => $(companionID)!.className = 'highlighted-cell');
}
}
clearTables(): void {
this.clearTable_(this.brailleTableElement_);
this.clearTable_(this.brailleTableElement2_);
}
removeBorders(cell: HTMLTableCellElement): void {
if (cell.tagName === 'TD') {
cell.className = 'unhighlighted-cell';
const companionIDs = cell.getAttribute('data-companionIDs');
companionIDs!.split(' ').forEach(
companionID => $(companionID)!.className = 'unhighlighted-cell');
}
}
routeCursor(cell: HTMLTableCellElement): void {
if (cell.tagName === 'TD') {
const displayPosition = parseInt(cell.id.split('-')[0], 10);
if (Number.isNaN(displayPosition)) {
throw new Error(
'The display position is calculated assuming that the cell ID ' +
'is formatted like int-string. For example, 0-brailleCell is a ' +
'valid cell ID.');
}
chrome.extension.getBackgroundPage()['ChromeVox'].braille.route(
displayPosition);
}
}
private clearTable_(table: HTMLTableElement): void {
const rowCount = table.rows.length;
for (let i = 0; i < rowCount; i++) {
table.deleteRow(0);
}
}
}
function $(id: string): HTMLElement | null {
return document.getElementById(id);
}
export namespace PanelCaptions {
export let braille: BrailleCaptions;
export function init(): void {
if (braille) {
throw new Error('Cannot create two PanelCaptions instances');
}
braille = new BrailleCaptions();
}
}