75 lines
2.1 KiB
Plaintext
75 lines
2.1 KiB
Plaintext
|
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;
|