yoastseo
Version:
Yoast client-side content analysis
94 lines (88 loc) • 4.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isVowelDoublingAllowed = isVowelDoublingAllowed;
exports.modifyStem = modifyStem;
var _yoastseo = require("yoastseo");
const {
exceptionListHelpers: {
checkIfWordEndingIsOnExceptionList,
checkIfWordIsOnListThatCanHavePrefix
}
} = _yoastseo.languageProcessing;
/**
* Checks whether the word is on any of the sub-lists of the noVowelDoublingList (ending match, exact match,
* and verbs) and returns true if it is.
*
* @param {string} word The word to check.
* @param {Object} noVowelDoublingList The list of stems that should not have the vowel doubled.
* @param {Object} compoundVerbPrefixes The list of inseparable and separable verb prefixes.
*
* @returns {boolean} Whether the word was found on one of the lists
*/
const checkIfWordIsOnNoVowelDoublingList = function (word, noVowelDoublingList, compoundVerbPrefixes) {
if (checkIfWordEndingIsOnExceptionList(word, noVowelDoublingList.endingMatch) || checkIfWordIsOnListThatCanHavePrefix(word, noVowelDoublingList.verbs, compoundVerbPrefixes) || noVowelDoublingList.exactMatch.includes(word)) {
return true;
}
};
/**
* Checks whether the third to last and fourth to last characters of the stem are the same. This, in principle, checks
* whether the last vowel of the stem is preceded by a double consonant (as only consonants can precede the vowel).
* If the third and fourth to last characters are the same, it means that vowel doubling is allowed. For example, in the
* word 'luttel', the third and fourth to last characters are both t's so it should not become 'lutteel'.
*
* @param {string} word The stemmed word to check.
*
* @returns {boolean} Whether the vowel should be doubled or not.
*/
const isVowelPrecededByDoubleConsonant = function (word) {
const fourthToLastLetter = word.charAt(word.length - 4);
const thirdToLastLetter = word.charAt(word.length - 3);
return fourthToLastLetter !== thirdToLastLetter;
};
/**
* Checks whether the second to last syllable contains a diphthong. If it does, the vowel in the last syllable should
* not be doubled.
*
* @param {string} word The stemmed word to check.
* @param {string} noVowelDoublingRegex The regex to match a word with.
*
* @returns {boolean} Whether the vowel should be doubled or not.
*/
const doesPrecedingSyllableContainDiphthong = function (word, noVowelDoublingRegex) {
return word.search(new RegExp(noVowelDoublingRegex)) === -1;
};
/**
* Modifies the stem of the word according to the specified modification type.
*
* @param {string} word The stem that needs to be modified.
* @param {string[]} modificationGroup The type of modification that needs to be done.
* @returns {string} The modified stem, or the same stem if no modification was made.
*/
function modifyStem(word, modificationGroup) {
const neededReplacement = modificationGroup.find(replacement => word.search(new RegExp(replacement[0])) !== -1);
if (typeof neededReplacement !== "undefined") {
word = word.replace(new RegExp(neededReplacement[0]), neededReplacement[1]);
}
return word;
}
/**
* Checks whether the final vowel of the stem should be doubled by going through four checks.
*
* @param {string} word The stemmed word that the check should be executed on.
* @param {Object} morphologyDataNLStemmingExceptions The Dutch morphology data for stemming exceptions.
* @param {Object} morphologyDataNLVerbPrefixes The separable and inseparable verb prefixes.
*
* @returns {boolean} Whether the vowel should be doubled or not.
*/
function isVowelDoublingAllowed(word, morphologyDataNLStemmingExceptions, morphologyDataNLVerbPrefixes) {
// Check whether the word is on the list of verbs which should have the vowel doubled (exception to third check)
const firstCheck = checkIfWordIsOnListThatCanHavePrefix(word, morphologyDataNLStemmingExceptions.getVowelDoubling, morphologyDataNLVerbPrefixes);
// Check whether the word is on the list of words which should NOT have the vowel doubled
const secondCheck = checkIfWordIsOnNoVowelDoublingList(word, morphologyDataNLStemmingExceptions.noVowelDoubling, morphologyDataNLVerbPrefixes);
const thirdCheck = isVowelPrecededByDoubleConsonant(word);
const fourthCheck = doesPrecedingSyllableContainDiphthong(word, morphologyDataNLStemmingExceptions.noVowelDoubling.rule);
return firstCheck || !secondCheck && thirdCheck && fourthCheck;
}
//# sourceMappingURL=stemModificationHelpers.js.map