UNPKG

yoastseo

Version:

Yoast client-side content analysis

70 lines (63 loc) 2.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = _default; var _lodash = require("lodash"); /** * Checks if the word matches any paradigm and creates the forms from the matched paradigm(s). * If no matches found, returns an array with the original word. * * @param {string} word The word to check. * @param {Object} morphologyData The morphology data. * * @returns {Array} The array of created forms. */ function createForms(word, morphologyData) { const paradigmEndingsGroups = morphologyData.paradigmGroups; // The endings in the array are sorted from the longest to the shortest. // This way, if there are multiple matches, the first element in the matched array is always the longest one. let allEndings = (0, _lodash.uniq)((0, _lodash.flatten)(paradigmEndingsGroups)); allEndings = allEndings.sort((a, b) => b.length - a.length || a.localeCompare(b)); // Check if the word matches any ending(s) and save the ending(s). const matchedEndings = allEndings.filter(ending => word.endsWith(ending)); const forms = []; if (matchedEndings.length === 0) { // If there is no match found, add the original word to the forms array. forms.push(word); } else { // Pick the longest ending. const matchedEnding = matchedEndings[0]; // Extract the stem. const matchedStem = word.slice(0, -matchedEnding.length); // Loop over each endings group in the endings group array. for (const endingsGroup of paradigmEndingsGroups) { // Check if the ending of the matched word can be found in the endings group and create all the forms with all the endings in the group. if (endingsGroup.includes(matchedEnding)) { forms.push(endingsGroup.map(ending => matchedStem + ending)); } } } // If the final character of the input word ends in る, also create an extra form where the character is removed. const ruEnding = "る"; if (word.endsWith(ruEnding)) { forms.push(word.slice(0, -ruEnding.length)); } return (0, _lodash.uniq)((0, _lodash.flatten)(forms)); } /** * Creates forms for Japanese word. * * @param {string} word The word to check. Assume that the input word is a segment as outputted from `getContentWords` helper. * @param {Object} morphologyData The morphology data. * * @returns {Array} The array of created forms. */ function _default(word, morphologyData) { // Check if the word is longer than 1 character. if (word.length <= 1) { return [word]; } return createForms(word, morphologyData); } //# sourceMappingURL=createWordForms.js.map