All files / roosterjs-content-model-dom/lib/modelApi/editing deleteSingleChar.ts

100% Statements 18/18
94.44% Branches 17/18
100% Functions 1/1
100% Lines 18/18

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39      1x   75x 75x   75x 75x 75x       155x         20x 20x 20x     135x 89x 89x 46x 46x   135x       75x   75x    
/**
 * @internal
 */
export function deleteSingleChar(text: string, isForward: boolean) {
    // In case of emoji that occupies multiple characters, we need to delete the whole emoji
    const array = [...text];
    let deleteLength = 0;
 
    for (
        let i = isForward ? 0 : array.length - 1,
            deleteState: 'notDeleted' | 'waiting' | 'done' = 'notDeleted';
        i >= 0 && i < array.length && deleteState != 'done';
        i += isForward ? 1 : -1
    ) {
        switch (array[i]) {
            case '\u200D': // ZERO WIDTH JOINER
            case '\u20E3': // COMBINING ENCLOSING KEYCAP
            case '\uFE0E': // VARIATION SELECTOR-15
            case '\uFE0F': // VARIATION SELECTOR-16
                deleteState = 'notDeleted';
                deleteLength++;
                break;
 
            default:
                if (deleteState == 'notDeleted') {
                    deleteState = 'waiting';
                    deleteLength++;
                } else Eif (deleteState == 'waiting') {
                    deleteState = 'done';
                }
                break;
        }
    }
 
    array.splice(isForward ? 0 : array.length - deleteLength, deleteLength);
 
    return array.join('');
}