@haystacks/async
Version:
A framework to build any number or any kind of native application or automation solution.
494 lines (476 loc) • 28 kB
JavaScript
/**
* @file wordStringParsing.js
* @module wordStringParsing
* @description Contains all system defined business rules for parsing words and lists.
* @requires module:ruleParsing
* @requires module:configurator
* @requires module:loggers
* @requires {@link https://www.npmjs.com/package/@haystacks/constants|@haystacks/constants}
* @requires {@link https://mathjs.org/index.html|math}
* @requires {@link https://www.npmjs.com/package/path|path}
* @author Seth Hollingsead
* @date 2022/04/25
* @copyright Copyright © 2022-… by Seth Hollingsead. All rights reserved
*/
// Internal imports
import ruleParsing from '../ruleParsing.js';
import configurator from '../../../executrix/configurator.js';
import loggers from '../../../executrix/loggers.js';
// External imports
import hayConst from '@haystacks/constants';
import * as math from 'mathjs';
import path from 'path';
const {abt, bas, biz, cfg, msg, sys, wrd} = hayConst;
const baseFileName = path.basename(import.meta.url, path.extname(import.meta.url));
// framework.businessRules.rules.stringParsing.wordStringParsing.
const namespacePrefix = wrd.cframework + bas.cDot + sys.cbusinessRules + bas.cDot + wrd.crules + bas.cDot + wrd.cstring + wrd.cParsing + bas.cDot + baseFileName + bas.cDot;
/**
* @function isStringCamelCase
* @description Determines if an input string is a camel case string or not.
* @param {string} inputData The string that should be checked for the camel case qualifications.
* @param {string} inputMetaData Not used for this business rule.
* @return {boolean} True or False to indicate if the string is camel case or not.
* @author Seth Hollingsead
* @date 2022/01/23
* @NOTE Even if we have an all upper case acronym at the end fo the camel case string,
* the string itself is still considered camel case.
* Valid Examples:
* myParsedXML
* fireflyWonder1996
* wonderWomand1984
* covidMedicalCase
* aBc
*/
async function isStringCamelCase(inputData, inputMetaData) {
let functionName = isStringCamelCase.name;
await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData);
let returnData = false;
if (inputData) {
let foundFirstCapitalLetter = false;
// First make sure the string meets the basic qualifications of a camel case string.
// 1. Does not contain underscore or dash word separators.
// 2. Contains at least 1 lower case letter or more.
// 3. Contains at least 1 upper case letter or more.
// 4. Has a lower case or upper case first letter of the first word.
let doesContainUpperCaseCharacter = await ruleParsing.processRulesInternal([inputData, ''], [biz.cdoesStringContainUpperCaseCharacter]);
let doesContainLowerCaseCharacter = await ruleParsing.processRulesInternal([inputData, ''], [biz.cdoesStringContainLowerCaseCharacter]);
let isFirstCharUpperCase = await ruleParsing.processRulesInternal([inputData, ''], [biz.cisFirstCharacterUpperCase]);
let isFirstCharLowerCase = await ruleParsing.processRulesInternal([inputData, ''], [biz.cisFirstCharacterLowerCase]);
if (!inputData.match(/[\s_-]/g) && doesContainUpperCaseCharacter &&
doesContainLowerCaseCharacter && (isFirstCharUpperCase || isFirstCharLowerCase)) {
for (let i = 1; i < inputData.length; i++) {
// Now check or the final qualification:
// 3. Ensure that upper case letters are separated by lower case letters
// (numbers also allowed, but there should be at least some lower case letters)
// NOTE: This for-loop is how we iterate over the characters of the string.
// First we need to ok for the first upper case letter.
if (foundFirstCapitalLetter === false) {
if (abt.cUpperCaseEnglishAlphabet.includes(inputData.charAt(i))) {
// Found an upper case letter, ensure the next letter is lower case.
foundFirstCapitalLetter = true;
}
} else if (foundFirstCapitalLetter === true) {
if (abt.cLowerCaseEnglishAlphabet.includes(inputData.charAt(i))) {
returnData = true;
break; // Sufficient evidence to prove this is a camel case string.
}
}
} // End-for (let i = 1; i < inputData.length; i++)
} // End-if (!inputData.match(/[\s_-]/g) && doesStringContainUpperCaseCharacter(inputData, '') &&...)
} // End-if (inputData)
await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function);
return returnData;
}
/**
* @function mapWordToCamelCaseWord
* @description Takes a string key and an indexed string value and maps the word to an upper case first letter word.
* @param {string} inputData The string key/value that should be converted to a camel case word.
* @param {string} inputMetaData The string index for the map to the value that should be used.
* @return {string} A string where the word has been converted into a camel case word.
* @author Seth Hollingsead
* @date 2022/01/23
*/
async function mapWordToCamelCaseWord(inputData, inputMetaData) {
let functionName = mapWordToCamelCaseWord.name;
await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData);
let returnData = false;
if (inputData) {
returnData = inputData.replace(/^./, character => character.toUpperCase());
}
await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function);
return returnData;
}
/**
* @function simplifyAndConsolidateString
* @description Takes a string, and returns a version of it converted to lower case,
* with all digits and symbols and whitespace removed.
* @param {string} inputData The string that should be simplified and consolidated.
* @param {string} inputMetaData Not used for this business rule.
* @return {string} A string that has been simplified and consolidated by converting to lower case, removing all digits, symbols and white space.
* @author Seth Hollingsead
* @date 2022/01/23
* @NOTE I think this function is not completely working as expected, probably something to do with that regular expression.
* Input was: 11UpberDriver321CodeClearance0x#0000FF-akaBlue
* Output was: upberdrivercodeclearanceffakablue
*/
async function simplifyAndConsolidateString(inputData, inputMetaData) {
let functionName = simplifyAndConsolidateString.name;
await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData);
let returnData = '';
if (inputData) {
// returnData = inputData.toLowerCase().replace(/[\W]/g, '');
returnData = await ruleParsing.processRulesInternal([inputData.toLowerCase().trim(), [/[^\w\s]/g, '']], [biz.cutilitiesReplaceCharacterWithCharacter]);
returnData = await ruleParsing.processRulesInternal([returnData, [/[\0-9]/g, '']], [biz.cutilitiesReplaceCharacterWithCharacter]);
} // End-if (inputData)
await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function);
return returnData;
}
/**
* @function compareSimplifiedAndConsolidatedStrings
* @description Compares two strings by their simplified versions (see simplifyAndConsolidateString()).
* @param {string} inputData The first string to be compared.
* @param {string} inputMetaData The second string to be compared.
* @return {boolean} A True or False value to indicate if the strings are virtually identical or not.
* @author Seth Hollingsead
* @date 2022/01/23
*/
async function compareSimplifiedAndConsolidatedStrings(inputData, inputMetaData) {
let functionName = compareSimplifiedAndConsolidatedStrings.name;
await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData);
let returnData = false;
if (inputData && inputMetaData) {
returnData = await simplifyAndConsolidateString(inputData, '') === await simplifyAndConsolidateString(inputMetaData, '');
}
await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function);
return returnData;
}
/**
* @function countCamelCaseWords
* @description Takes a string in camelCase and returns the number of words that it contains based on camel case rules.
* @param {string} inputData String to count words from.
* @param {string} inputMetaData Not used for this business rule.
* @return {integer} The number of camel case words found in the string.
* @author Seth Hollingsead
* @date 2022/01/23
* @NOTE Might not work so well with numbers as part of the string, they are not treated as capital letters.
* We might need to do some refactoring of this function if
* mixed numbers and camel case strings ever becomes a requirement as input to this function.
* @NOTE Based on the implementation for the business rule/function arrayParsing.convertCamelCaseStringToArray.
*/
async function countCamelCaseWords(inputData, inputMetaData) {
let functionName = countCamelCaseWords.name;
await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData);
let returnData = 0;
if (inputData) {
let caps = [];
for (let i = 0; i < inputData.length; i++) {
await loggers.consoleLog(namespacePrefix + functionName, msg.ccharacterIs + inputData.charAt(i));
if (abt.cUpperCaseEnglishAlphabet.includes(inputData.charAt(i))) {
// Upper case letter found.
await loggers.consoleLog(namespacePrefix + functionName, msg.cupperCaseLetterFound);
caps.push(i);
}
} // End-for (let i = 1; i < inputData.length; i++)
returnData = caps.length;
} // End-if (inputData)
await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function);
return returnData;
}
/**
* @function doesStringContainAcronym
* @description Scans a string and determines if there are 2 or more immediately adjacent upper-case characters in the string.
* Example: nodeJS where JS is an acronym for JavaScript.
* @param {string} inputData The string that should be scanned to determine if it contains an acronym or not.
* @param {string} inputMetaData Not used for this business rule.
* @return {boolean} True or False to indicate if the input string contains an acronym.
* @author Seth Hollingsead
* @date 2022/01/23
*/
async function doesStringContainAcronym(inputData, inputMetaData) {
let functionName = doesStringContainAcronym.name;
await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData);
let returnData = false;
let lastCharacterWasUpperCase = false;
if (inputData) {
for (let i = 1; i < inputData.length; i++) {
// if the last character was upper case and the current character is upper case,
// then we have found an acronym and we can exit the loop.
if (lastCharacterWasUpperCase === true && abt.cUpperCaseEnglishAlphabet.includes(inputData.charAt(i))) {
returnData = true;
break;
}
if (abt.cUpperCaseEnglishAlphabet.includes(inputData.charAt(i))) {
lastCharacterWasUpperCase = true;
} else {
lastCharacterWasUpperCase = false;
}
} // End-for (let i = 1; i < inputData.length; i++)
} // End-if (inputData)
await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function);
return returnData;
}
/**
* @function determineWordDelimiter
* @description Determines what delimiter should e used to break a string up into words if possible.
* @param {string} inputData The string that should be examined to determine what delimiter should be used to break it up into words.
* @param {string} inputMetaData Not used for this business rule.
* @return {string} The delimiter that should be used, or if camelCase then the function will return the string "CamelCase".
* @author Seth Hollingsead
* @date 2022/01/23
*/
async function determineWordDelimiter(inputData, inputMetaData) {
let functionName = determineWordDelimiter.name;
await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData);
let returnData = '';
if (inputData) {
let camelCaseWordCount = await countCamelCaseWords(inputData, '');
await loggers.consoleLog(namespacePrefix + functionName, msg.ccamelCaseWordCountIs + camelCaseWordCount);
let containsAcronym = await doesStringContainAcronym(inputData, '');
await loggers.consoleLog(namespacePrefix + functionName, msg.ccontainsAcronymIs + containsAcronym);
let spacesCount = await countDelimiterInString(inputData, bas.cSpace);
await loggers.consoleLog(namespacePrefix + functionName, msg.cspacesCountIs + spacesCount);
let periodCount = await countDelimiterInString(inputData, bas.cDot);
await loggers.consoleLog(namespacePrefix + functionName, msg.cperiodCountIs + periodCount);
let dashCount = await countDelimiterInString(inputData, bas.cDash);
await loggers.consoleLog(namespacePrefix + functionName, msg.cdashCountIs + dashCount);
let comaCount = await countDelimiterInString(inputData, bas.cComa);
await loggers.consoleLog(namespacePrefix + functionName, msg.ccomaCountIs + comaCount);
let underscoreCount = await countDelimiterInString(inputData, bas.cUnderscore);
await loggers.consoleLog(namespacePrefix + functionName, msg.cunderscoreCountIs + underscoreCount);
let plusCount = await countDelimiterInString(inputData, bas.cPlus);
await loggers.consoleLog(namespacePrefix + functionName, msg.cplusCountIs + plusCount);
let percentCount = await countDelimiterInString(inputData, bas.cPercent);
await loggers.consoleLog(namespacePrefix + functionName, msg.cpercentCountIs + percentCount);
if (
camelCaseWordCount > 0 &&
containsAcronym === false &&
spacesCount === 0 &&
periodCount === 0 &&
dashCount === 0 &&
comaCount === 0 &&
underscoreCount === 0 &&
plusCount === 0 &&
percentCount === 0) {
returnData = sys.cCamelCase;
// We haven't hit the case eyt where we need to differentiate between all these extra cases, and there are several of them.
// We could have multiple acronyms in a word, or in multiple words that are camelCase.
// Each of these could be really complex special cases.
// If we get to that point we will handle those cases on a case by case basis to improve the algorithm.
} else if (spacesCount > 0 && periodCount === 0 && dashCount === 0 && comaCount === 0 && underscoreCount === 0 && plusCount === 0 && percentCount === 0) {
returnData = bas.cSpace;
} else if (spacesCount === 0 && periodCount > 0 && dashCount === 0 && comaCount === 0 && underscoreCount === 0 && plusCount === 0 && percentCount === 0) {
returnData = bas.cDot;
} else if (spacesCount === 0 && periodCount === 0 && dashCount > 0 && comaCount === 0 && underscoreCount === 0 && plusCount === 0 && percentCount === 0) {
returnData = bas.cDash;
} else if (spacesCount === 0 && periodCount === 0 && dashCount === 0 && comaCount > 0 && underscoreCount === 0 && plusCount === 0 && percentCount === 0) {
returnData = bas.cComa;
} else if (spacesCount === 0 && periodCount === 0 && dashCount === 0 && comaCount === 0 && underscoreCount > 0 && plusCount === 0 && percentCount === 0) {
returnData = bas.cUnderscore;
} else if (spacesCount === 0 && periodCount === 0 && dashCount === 0 && comaCount === 0 && underscoreCount === 0 && plusCount > 0 && percentCount === 0) {
returnData = bas.cPlus;
} else if (spacesCount === 0 && periodCount === 0 && dashCount === 0 && comaCount === 0 && underscoreCount === 0 && plusCount === 0 && percentCount > 0) {
returnData = bas.cPercent;
} else {
if (spacesCount > periodCount && spacesCount > dashCount && spacesCount > comaCount && spacesCount > underscoreCount && spacesCount > plusCount && spacesCount > percentCount) {
returnData = bas.cSpace;
} else if (periodCount > spacesCount && periodCount > dashCount && periodCount > comaCount && periodCount > underscoreCount && periodCount > plusCount && periodCount > percentCount) {
returnData = bas.cDot;
} else if (dashCount > spacesCount && dashCount > periodCount && dashCount > comaCount && dashCount > underscoreCount && dashCount > plusCount && dashCount > percentCount) {
returnData = bas.cDash;
} else if (comaCount > spacesCount && comaCount > periodCount && comaCount > dashCount && comaCount > underscoreCount && comaCount > plusCount && comaCount > percentCount) {
returnData = bas.cComa;
} else if (underscoreCount > spacesCount && underscoreCount > periodCount && underscoreCount > dashCount && underscoreCount > comaCount && underscoreCount > plusCount && underscoreCount > percentCount) {
returnData = bas.cUnderscore;
} else if (plusCount > spacesCount && plusCount > periodCount && plusCount > dashCount && plusCount > comaCount && plusCount > underscoreCount && plusCount > percentCount) {
returnData = bas.cPlus;
} else if (percentCount > spacesCount && percentCount > periodCount && percentCount > dashCount && percentCount > comaCount && percentCount > underscoreCount && percentCount > plusCount) {
returnData = bas.cPercent;
} else {
// We don't need to be showing this warning unless we are debugging.
// WARNING: Mixed string. Cannot determine what delimiter should be used to break up the string into words.
await loggers.consoleLog(namespacePrefix + functionName, msg.cDetermineWordDelimiterMessage1 + msg.cDetermineWordDelimiterMessage2 +
msg.cDetermineWordDelimiterMessage3 + msg.cDetermineWordDelimiterMessage4);
}
}
} // End-if (inputData)
await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function);
return returnData;
}
/**
* @function countDelimiterInString
* @description Takes a string and returns the number of specified delimiters it contains.
* @param {string} inputData String to count delimiters from.
* @param {string} inputMetaData The delimiter that should be used when counting from the input string.
* @return {integer} The number of delimiters found in the string.
* @author Seth Hollingsead
* @date 2022/01/23
* @NOTE: https://stackoverflow.com/questions/35849174/count-spaces-in-a-string
*/
async function countDelimiterInString(inputData, inputMetaData) {
let functionName = countDelimiterInString.name;
await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData);
let returnData = 0;
if (inputData && inputMetaData) {
returnData = (inputData.split(inputMetaData).length - 1);
}
await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function);
return returnData;
}
/**
* @function getWordCountInString
* @description Gets the number of words in a string, it expects words to be
* delimited by either camel-case, spaces, period, dash, underscore, plus or percent symbols.
* @param {string} inputData The string that words should be counted from.
* @param {string} inputMetaData Not used for this business rule.
* @return {integer} The number of words that were found in the string.
* @author Seth Hollingsead
* @date 2022/01/23
*/
async function getWordCountInString(inputData, inputMetaData) {
let functionName = getWordCountInString.name;
await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData);
let returnData = 0;
if (inputData) {
let wordDelimiter = await determineWordDelimiter(inputData, inputMetaData);
if (wordDelimiter === sys.cCamelCase) {
returnData = await countCamelCaseWords(inputData, '');
} else if (wordDelimiter !== '') {
returnData = inputData.split(wordDelimiter).length;
} else {
// We don't need to be showing this warning unless we are debugging.
// WARNING: Mixed string. Cannot determine how words are delimited in the string. Unable to count words.
await loggers.consoleLog(namespacePrefix + functionName, msg.cGetWordCountInStringMessage1 + msg.cGetWordCountInStringMessage2 + msg.cGetWordCountInStringMessage3);
}
} // End-if (inputData)
await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function);
return returnData;
}
/**
* @function isStringList
* @description Determines if the input string is a list or not.
* @param {string} inputData The string that should be checked if it is a list or not.
* @param {string} inputMetaData Not used for this business rule.
* @return {boolean} True or False to indicate if the input string is a list or not a list.
* Using the list of system defined primary, secondary or tertiary command delimiters.
* @author Seth Hollingsead
* @date 2022/01/23
*/
async function isStringList(inputData, inputMetaData) {
let functionName = isStringList.name;
await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function);
console.log(msg.cinputDataIs + inputData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData);
console.log(msg.cinputMetaDataIs + inputMetaData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData);
let returnData = false;
if (inputData) {
let primaryCommandDelimiter = await configurator.getConfigurationSetting(wrd.csystem, cfg.cprimaryCommandDelimiter);
let secondaryCommandDelimiter = await configurator.getConfigurationSetting(wrd.csystem, cfg.csecondaryCommandDelimiter);
let tertiaryCommandDelimiter = await configurator.getConfigurationSetting(wrd.csystem, cfg.ctertiaryCommandDelimiter);
if (inputData.includes(primaryCommandDelimiter) === true ||
inputData.includes(secondaryCommandDelimiter) === true ||
inputData.includes(tertiaryCommandDelimiter) === true) {
returnData = true;
}
} // End-if (inputData)
console.log(msg.creturnDataIs + returnData);
await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function);
return returnData;
}
/**
* @function aggregateNumericalDifferenceBetweenTwoStrings
* @description Determines the delta difference between the two input strings and returns it as a number.
* @param {string} inputData String 1 to compare.
* @param {string} inputMetaData String 2 to compare.
* @return {integer} The delta difference between the two strings, expressed as a number.
* @author Seth Hollingsead
* @date 2022/01/23
*/
async function aggregateNumericalDifferenceBetweenTwoStrings(inputData, inputMetaData) {
let functionName = aggregateNumericalDifferenceBetweenTwoStrings.name;
await loggers.consoleLog(namespacePrefix + functionName, msg.cBEGIN_Function);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputDataIs + inputData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinputMetaDataIs + inputMetaData);
let returnData = -1;
if (inputData && inputMetaData) {
// Convert the input strings to lower case and clean them up for parsing.
let string1 = inputData.toLowerCase().replace(/\W/g, '');
let string2 = inputMetaData.toLowerCase().replace(/\W/g, '');
await loggers.consoleLog(namespacePrefix + functionName, msg.cstring1Is + string1);
await loggers.consoleLog(namespacePrefix + functionName, msg.cstring2Is + string2);
// Build some arrays of variations on string 2, we will use these for doing the comparisons.
let variation0 = Array(string2.length + 1).fill(0).map((v, i) => i);
let variation1 = Array(string2.length + 1).fill(0);
await loggers.consoleLog(namespacePrefix + functionName, msg.cvariation0ValueIs + variation0);
await loggers.consoleLog(namespacePrefix + functionName, msg.cvariation1ValueIs + variation1);
for (let i = 0; i < string1.length; i++) {
await loggers.consoleLog(namespacePrefix + functionName, msg.ciValueIs + i);
variation1[0] = i + 1;
await loggers.consoleLog(namespacePrefix + functionName, msg.cvariation0ValueIs + variation0);
for (let j = 0; j < string2.length; j++) {
await loggers.consoleLog(namespacePrefix + functionName, msg.cjValueIs + j);
let deletionCost = variation0[j + 1] + 1;
let insertionCost = variation1[j] + 1;
let substitutionCost;
if (string1[i] === string2[j]) {
substitutionCost = variation0[j];
} else {
substitutionCost = variation0[j] + 1;
}
await loggers.consoleLog(namespacePrefix + functionName, msg.cdeletionCostIs + deletionCost);
await loggers.consoleLog(namespacePrefix + functionName, msg.cinsertionCostIs + insertionCost);
await loggers.consoleLog(namespacePrefix + functionName, msg.csubstitutionCostIs + substitutionCost);
variation1[j + 1] = math.min(deletionCost, insertionCost, substitutionCost);
await loggers.consoleLog(namespacePrefix + functionName, msg.cvariation1ValueIs + variation1);
} // End-for (let j = 0; j < string2.length; j++)
let temp = variation1;
variation1 = variation0;
variation0 = temp;
} // End-for (let i = 0; i < string1.length; i++)
returnData = variation0[string2.length];
} // End-if (inputData && inputMetaData)
await loggers.consoleLog(namespacePrefix + functionName, msg.creturnDataIs + returnData);
await loggers.consoleLog(namespacePrefix + functionName, msg.cEND_Function);
return returnData;
}
export default {
isStringCamelCase,
mapWordToCamelCaseWord,
simplifyAndConsolidateString,
compareSimplifiedAndConsolidatedStrings,
countCamelCaseWords,
doesStringContainAcronym,
determineWordDelimiter,
countDelimiterInString,
getWordCountInString,
isStringList,
aggregateNumericalDifferenceBetweenTwoStrings
};