import { SubstitutionAction } from './featureQuery'; /** * Apply single substitution format 1 * @param {Array} substitutions substitutions * @param {any} tokens a list of tokens * @param {number} index token index */ function singleSubstitutionFormat1(action, tokens, index) { tokens[index].setState(action.tag, action.substitution); } /** * Apply single substitution format 2 * @param {Array} substitutions substitutions * @param {any} tokens a list of tokens * @param {number} index token index */ function singleSubstitutionFormat2(action, tokens, index) { tokens[index].setState(action.tag, action.substitution); } /** * Apply chaining context substitution format 3 * @param {Array} substitutions substitutions * @param {any} tokens a list of tokens * @param {number} index token index */ function chainingSubstitutionFormat3(action, tokens, index) { action.substitution.forEach((subst, offset) => { const token = tokens[index + offset]; token.setState(action.tag, subst); }); } /** * Apply ligature substitution format 1 * @param {Array} substitutions substitutions * @param {any} tokens a list of tokens * @param {number} index token index */ function ligatureSubstitutionFormat1(action, tokens, index) { let token = tokens[index]; token.setState(action.tag, action.substitution.ligGlyph); const compsCount = action.substitution.components.length; for (let i = 0; i < compsCount; i++) { token = tokens[index + i + 1]; token.setState('deleted', true); } } /** * Supported substitutions */ const SUBSTITUTIONS = { 11: singleSubstitutionFormat1, 12: singleSubstitutionFormat2, 63: chainingSubstitutionFormat3, 41: ligatureSubstitutionFormat1 }; /** * Apply substitutions to a list of tokens * @param {Array} substitutions substitutions * @param {any} tokens a list of tokens * @param {number} index token index */ function applySubstitution(action, tokens, index) { if (action instanceof SubstitutionAction && SUBSTITUTIONS[action.id]) { SUBSTITUTIONS[action.id](action, tokens, index); } } export default applySubstitution;