axyseo 2.0.0-alpha.0.0.61 → 2.0.0-alpha.0.0.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/languageProcessing/researches/checkRelatedKeywords.js +3 -2
- package/build/languageProcessing/researches/checkRelatedKeywords.js.map +1 -1
- package/build/languageProcessing/researches/getSentenceBeginnings.js +2 -0
- package/build/languageProcessing/researches/getSentenceBeginnings.js.map +1 -1
- package/package.json +1 -1
|
@@ -50,8 +50,9 @@ const countWordsInRelatedKeywords = ({
|
|
|
50
50
|
related_keywords.forEach(({
|
|
51
51
|
text
|
|
52
52
|
}) => {
|
|
53
|
-
const keyword = text.
|
|
54
|
-
const
|
|
53
|
+
const keyword = text.toLocaleLowerCase();
|
|
54
|
+
const regex = new RegExp(`(?:^|\\W)${keyword}(?:\\W|$)`, 'gu');
|
|
55
|
+
const length = (string.match(regex) || []).length;
|
|
55
56
|
const percentage = parseFloat((length / total * 100).toFixed(1));
|
|
56
57
|
if (!isWordUsedExceeding) {
|
|
57
58
|
isWordUsedExceeding = percentage > 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkRelatedKeywords.js","names":["paper","researcher","data","getData","related_keywords","transformRelatedKeyword","string","getTextFullPage","countWordsInRelatedKeywords","keywords","map","keyword","text","faqString","faqs","status","questions","i","question","answer","join","html","body_html","descriptionHtml","bodyString","length","replace","title","metafields_avadaSEO_after_content","metafields_global_title_tag","metafields_global_description_tag","toLowerCase","total","split","filter","word","words","totalWordUsed","isWordUsedExceeding","forEach","
|
|
1
|
+
{"version":3,"file":"checkRelatedKeywords.js","names":["paper","researcher","data","getData","related_keywords","transformRelatedKeyword","string","getTextFullPage","countWordsInRelatedKeywords","keywords","map","keyword","text","faqString","faqs","status","questions","i","question","answer","join","html","body_html","descriptionHtml","bodyString","length","replace","title","metafields_avadaSEO_after_content","metafields_global_title_tag","metafields_global_description_tag","toLowerCase","total","split","filter","word","words","totalWordUsed","isWordUsedExceeding","forEach","toLocaleLowerCase","regex","RegExp","match","percentage","parseFloat","toFixed"],"sources":["../../../src/languageProcessing/researches/checkRelatedKeywords.js"],"sourcesContent":["/**\n * Checks how many sentences from a text contain at least one transition word or two-part transition word\n * that are defined in the transition words config and two part transition words config.\n *\n * @param {Paper} paper The Paper object to get text from.\n * @param {Researcher} researcher The researcher.\n *\n * @returns {object} An object with the total number of sentences in the text\n * and the total number of sentences containing one or more transition words.\n */\nexport default function(paper, researcher) {\n const data = paper.getData();\n const related_keywords = transformRelatedKeyword(data?.related_keywords || []);\n const string = getTextFullPage(data);\n return countWordsInRelatedKeywords({related_keywords, string});\n}\n\nexport const transformRelatedKeyword = keywords =>\n keywords.map(keyword => (typeof keyword === 'string' ? {text: keyword} : keyword)) || [];\n\n/**\n *\n * @param data\n * @returns {string}\n */\nconst getTextFullPage = data => {\n const faqString = data.faqs.status\n ? data.faqs.questions.map(i => i.question + ' ' + i.answer).join(' ')\n : '';\n const html = data.body_html || data.descriptionHtml;\n const bodyString = html?.length > 0 ? html.replace(/<\\/?[^>]+(>|$)/g, ' ') : '';\n return [\n faqString,\n data.title,\n bodyString,\n data?.metafields_avadaSEO_after_content,\n data.metafields_global_title_tag,\n data.metafields_global_description_tag\n ]\n .join(' ')\n .toLowerCase();\n};\n\n/**\n *\n * @param related_keywords\n * @param string\n * @returns {{totalWordUsed: number, words: {}, isWordUsedExceeding: boolean}}\n */\nconst countWordsInRelatedKeywords = ({related_keywords, string}) => {\n const total = string.split(/\\s+/).filter(word => word.length > 0).length;\n const words = {};\n let totalWordUsed = 0;\n let isWordUsedExceeding = false;\n\n related_keywords.forEach(({text}) => {\n const keyword = text.toLocaleLowerCase();\n\n const regex = new RegExp(`(?:^|\\\\W)${keyword}(?:\\\\W|$)`, 'gu');\n const length = (string.match(regex) || []).length;\n\n const percentage = parseFloat(((length / total) * 100).toFixed(1));\n if (!isWordUsedExceeding) {\n isWordUsedExceeding = percentage > 1;\n }\n totalWordUsed += length;\n words[text] = {length, percentage};\n });\n\n return {totalWordUsed, words, isWordUsedExceeding};\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAASA,KAAK,EAAEC,UAAU,EAAE;EACzC,MAAMC,IAAI,GAAGF,KAAK,CAACG,OAAO,CAAC,CAAC;EAC5B,MAAMC,gBAAgB,GAAGC,uBAAuB,CAACH,IAAI,EAAEE,gBAAgB,IAAI,EAAE,CAAC;EAC9E,MAAME,MAAM,GAAGC,eAAe,CAACL,IAAI,CAAC;EACpC,OAAOM,2BAA2B,CAAC;IAACJ,gBAAgB;IAAEE;EAAM,CAAC,CAAC;AAChE;AAEA,OAAO,MAAMD,uBAAuB,GAAGI,QAAQ,IAC7CA,QAAQ,CAACC,GAAG,CAACC,OAAO,IAAK,OAAOA,OAAO,KAAK,QAAQ,GAAG;EAACC,IAAI,EAAED;AAAO,CAAC,GAAGA,OAAQ,CAAC,IAAI,EAAE;;AAE1F;AACA;AACA;AACA;AACA;AACA,MAAMJ,eAAe,GAAGL,IAAI,IAAI;EAC9B,MAAMW,SAAS,GAAGX,IAAI,CAACY,IAAI,CAACC,MAAM,GAC9Bb,IAAI,CAACY,IAAI,CAACE,SAAS,CAACN,GAAG,CAACO,CAAC,IAAIA,CAAC,CAACC,QAAQ,GAAG,GAAG,GAAGD,CAAC,CAACE,MAAM,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,GACnE,EAAE;EACN,MAAMC,IAAI,GAAGnB,IAAI,CAACoB,SAAS,IAAIpB,IAAI,CAACqB,eAAe;EACnD,MAAMC,UAAU,GAAGH,IAAI,EAAEI,MAAM,GAAG,CAAC,GAAGJ,IAAI,CAACK,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,GAAG,EAAE;EAC/E,OAAO,CACLb,SAAS,EACTX,IAAI,CAACyB,KAAK,EACVH,UAAU,EACVtB,IAAI,EAAE0B,iCAAiC,EACvC1B,IAAI,CAAC2B,2BAA2B,EAChC3B,IAAI,CAAC4B,iCAAiC,CACvC,CACEV,IAAI,CAAC,GAAG,CAAC,CACTW,WAAW,CAAC,CAAC;AAClB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,MAAMvB,2BAA2B,GAAGA,CAAC;EAACJ,gBAAgB;EAAEE;AAAM,CAAC,KAAK;EAClE,MAAM0B,KAAK,GAAG1B,MAAM,CAAC2B,KAAK,CAAC,KAAK,CAAC,CAACC,MAAM,CAACC,IAAI,IAAIA,IAAI,CAACV,MAAM,GAAG,CAAC,CAAC,CAACA,MAAM;EACxE,MAAMW,KAAK,GAAG,CAAC,CAAC;EAChB,IAAIC,aAAa,GAAG,CAAC;EACrB,IAAIC,mBAAmB,GAAG,KAAK;EAE/BlC,gBAAgB,CAACmC,OAAO,CAAC,CAAC;IAAC3B;EAAI,CAAC,KAAK;IACnC,MAAMD,OAAO,GAAGC,IAAI,CAAC4B,iBAAiB,CAAC,CAAC;IAExC,MAAMC,KAAK,GAAG,IAAIC,MAAM,CAAC,YAAY/B,OAAO,WAAW,EAAE,IAAI,CAAC;IAC9D,MAAMc,MAAM,GAAG,CAACnB,MAAM,CAACqC,KAAK,CAACF,KAAK,CAAC,IAAI,EAAE,EAAEhB,MAAM;IAEjD,MAAMmB,UAAU,GAAGC,UAAU,CAAC,CAAEpB,MAAM,GAAGO,KAAK,GAAI,GAAG,EAAEc,OAAO,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,CAACR,mBAAmB,EAAE;MACxBA,mBAAmB,GAAGM,UAAU,GAAG,CAAC;IACtC;IACAP,aAAa,IAAIZ,MAAM;IACvBW,KAAK,CAACxB,IAAI,CAAC,GAAG;MAACa,MAAM;MAAEmB;IAAU,CAAC;EACpC,CAAC,CAAC;EAEF,OAAO;IAACP,aAAa;IAAED,KAAK;IAAEE;EAAmB,CAAC;AACpD,CAAC","ignoreList":[]}
|
|
@@ -5,6 +5,7 @@ import { stripFullTags as stripTags } from "../helpers/sanitize/stripHTMLTags.js
|
|
|
5
5
|
import { filter, forEach, isEmpty } from 'lodash';
|
|
6
6
|
import removeHtmlBlocks from "../helpers/html/htmlParser";
|
|
7
7
|
import { filterShortcodesFromHTML } from "../helpers";
|
|
8
|
+
import stripNonTextTags from "../helpers/sanitize/stripNonTextTags";
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Compares the first word of each sentence with the first word of the following sentence.
|
|
@@ -92,6 +93,7 @@ export default function (paper, researcher) {
|
|
|
92
93
|
const memoizedTokenizer = researcher.getHelper('memoizedTokenizer');
|
|
93
94
|
let text = paper.getText();
|
|
94
95
|
text = removeHtmlBlocks(text);
|
|
96
|
+
text = stripNonTextTags(text);
|
|
95
97
|
text = filterShortcodesFromHTML(text, paper._attributes && paper._attributes.shortcodes);
|
|
96
98
|
|
|
97
99
|
// Remove any HTML whitespace padding and replace it with a single whitespace.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSentenceBeginnings.js","names":["getWords","getSentences","stripSpaces","stripFullTags","stripTags","filter","forEach","isEmpty","removeHtmlBlocks","filterShortcodesFromHTML","startsWithSameWord","currentSentenceBeginning","nextSentenceBeginning","compareFirstWords","sentenceBeginnings","sentences","consecutiveFirstWords","foundSentences","sameBeginnings","beginning","i","push","word","count","getSentenceBeginning","sentence","firstWordExceptions","secondWordExceptions","getWordsCustomHelper","stripped","words","test","length","firstWord","toLocaleLowerCase","indexOf","includes","paper","researcher","getConfig","getHelper","memoizedTokenizer","text","getText","_attributes","shortcodes","replace","map"],"sources":["../../../src/languageProcessing/researches/getSentenceBeginnings.js"],"sourcesContent":["import getWords from '../helpers/word/getWords.js';\nimport getSentences from '../helpers/sentence/getSentences';\nimport stripSpaces from '../helpers/sanitize/stripSpaces.js';\nimport {stripFullTags as stripTags} from '../helpers/sanitize/stripHTMLTags.js';\n\nimport {filter, forEach, isEmpty} from 'lodash';\nimport removeHtmlBlocks from '../helpers/html/htmlParser';\nimport {filterShortcodesFromHTML} from '../helpers';\n\n/**\n * Compares the first word of each sentence with the first word of the following sentence.\n *\n * @param {string} currentSentenceBeginning The first word of the current sentence.\n * @param {string} nextSentenceBeginning The first word of the next sentence.\n * @returns {boolean} Returns true if sentence beginnings match.\n */\nconst startsWithSameWord = function(currentSentenceBeginning, nextSentenceBeginning) {\n return !isEmpty(currentSentenceBeginning) && currentSentenceBeginning === nextSentenceBeginning;\n};\n\n/**\n * Counts the number of similar sentence beginnings.\n *\n * @param {Array} sentenceBeginnings The array containing the first word of each sentence.\n * @param {Array} sentences The array containing all sentences.\n * @returns {Array} The array containing the objects containing the first words and the corresponding counts.\n */\nconst compareFirstWords = function(sentenceBeginnings, sentences) {\n const consecutiveFirstWords = [];\n let foundSentences = [];\n let sameBeginnings = 1;\n\n forEach(sentenceBeginnings, function(beginning, i) {\n const currentSentenceBeginning = beginning;\n const nextSentenceBeginning = sentenceBeginnings[i + 1];\n foundSentences.push(sentences[i]);\n\n if (startsWithSameWord(currentSentenceBeginning, nextSentenceBeginning)) {\n sameBeginnings++;\n } else {\n consecutiveFirstWords.push({\n word: currentSentenceBeginning,\n count: sameBeginnings,\n sentences: foundSentences\n });\n sameBeginnings = 1;\n foundSentences = [];\n }\n });\n\n return consecutiveFirstWords;\n};\n\n/**\n * Retrieves the first word from the sentence. If the first or second word is on an exception list of words that should not be considered as sentence\n * beginnings, the following word is also retrieved.\n *\n * @param {string} sentence The sentence to retrieve the first word from.\n * @param {Array} firstWordExceptions First word exceptions to match against.\n * @param {Array} secondWordExceptions Second word exceptions to match against.\n * @param {function}\tgetWordsCustomHelper The language-specific helper function to retrieve words from text.\n *\n * @returns {string} The first word of the sentence.\n */\nfunction getSentenceBeginning(\n sentence,\n firstWordExceptions,\n secondWordExceptions,\n getWordsCustomHelper\n) {\n const stripped = stripTags(stripSpaces(sentence));\n let words = getWordsCustomHelper ? getWordsCustomHelper(stripped) : getWords(stripped);\n\n words = words.filter(word => /^\\p{L}/u.test(word));\n\n if (words.length === 0) {\n return '';\n }\n\n let firstWord = words[0].toLocaleLowerCase();\n\n if (firstWordExceptions.indexOf(firstWord) > -1 && words.length > 1) {\n firstWord = firstWord + ' ' + words[1];\n if (secondWordExceptions) {\n if (secondWordExceptions.includes(words[1])) {\n firstWord = firstWord + ' ' + words[2];\n }\n }\n }\n\n return firstWord;\n}\n\n/**\n * Gets the first word of each sentence from the text, and returns an object containing the first word of each sentence and the corresponding counts.\n *\n * @param {Paper} paper The Paper object to get the text from.\n * @param {Researcher} researcher The researcher this research is a part of.\n *\n * @returns {Object} The object containing the first word of each sentence and the corresponding counts.\n */\nexport default function(paper, researcher) {\n const firstWordExceptions = researcher.getConfig('firstWordExceptions');\n const secondWordExceptions = researcher.getConfig('secondWordExceptions');\n const getWordsCustomHelper = researcher.getHelper('getWordsCustomHelper');\n const memoizedTokenizer = researcher.getHelper('memoizedTokenizer');\n\n let text = paper.getText();\n text = removeHtmlBlocks(text);\n text = filterShortcodesFromHTML(text, paper._attributes && paper._attributes.shortcodes);\n\n // Remove any HTML whitespace padding and replace it with a single whitespace.\n text = text.replace(/[\\s\\n]+/g, ' ');\n\n // Exclude text inside tables.\n text = text.replace(/<figure class='wp-block-table'>.*<\\/figure>/gs, '');\n\n let sentences = getSentences(text, memoizedTokenizer);\n\n let sentenceBeginnings = sentences.map(function(sentence) {\n return getSentenceBeginning(\n sentence,\n firstWordExceptions,\n secondWordExceptions,\n getWordsCustomHelper\n );\n });\n\n sentences = sentences.filter(function(sentence) {\n const stripped = stripSpaces(sentence);\n const words = getWordsCustomHelper ? getWordsCustomHelper(stripped) : getWords(stripped);\n return words.length > 0;\n });\n sentenceBeginnings = filter(sentenceBeginnings);\n\n return compareFirstWords(sentenceBeginnings, sentences);\n}\n"],"mappings":"AAAA,OAAOA,QAAQ;AACf,OAAOC,YAAY;AACnB,OAAOC,WAAW;AAClB,SAAQC,aAAa,IAAIC,SAAS;AAElC,SAAQC,MAAM,EAAEC,OAAO,EAAEC,OAAO,QAAO,QAAQ;AAC/C,OAAOC,gBAAgB;AACvB,SAAQC,wBAAwB;;
|
|
1
|
+
{"version":3,"file":"getSentenceBeginnings.js","names":["getWords","getSentences","stripSpaces","stripFullTags","stripTags","filter","forEach","isEmpty","removeHtmlBlocks","filterShortcodesFromHTML","stripNonTextTags","startsWithSameWord","currentSentenceBeginning","nextSentenceBeginning","compareFirstWords","sentenceBeginnings","sentences","consecutiveFirstWords","foundSentences","sameBeginnings","beginning","i","push","word","count","getSentenceBeginning","sentence","firstWordExceptions","secondWordExceptions","getWordsCustomHelper","stripped","words","test","length","firstWord","toLocaleLowerCase","indexOf","includes","paper","researcher","getConfig","getHelper","memoizedTokenizer","text","getText","_attributes","shortcodes","replace","map"],"sources":["../../../src/languageProcessing/researches/getSentenceBeginnings.js"],"sourcesContent":["import getWords from '../helpers/word/getWords.js';\nimport getSentences from '../helpers/sentence/getSentences';\nimport stripSpaces from '../helpers/sanitize/stripSpaces.js';\nimport {stripFullTags as stripTags} from '../helpers/sanitize/stripHTMLTags.js';\n\nimport {filter, forEach, isEmpty} from 'lodash';\nimport removeHtmlBlocks from '../helpers/html/htmlParser';\nimport {filterShortcodesFromHTML} from '../helpers';\nimport stripNonTextTags from '@axyseo/languageProcessing/helpers/sanitize/stripNonTextTags';\n\n/**\n * Compares the first word of each sentence with the first word of the following sentence.\n *\n * @param {string} currentSentenceBeginning The first word of the current sentence.\n * @param {string} nextSentenceBeginning The first word of the next sentence.\n * @returns {boolean} Returns true if sentence beginnings match.\n */\nconst startsWithSameWord = function(currentSentenceBeginning, nextSentenceBeginning) {\n return !isEmpty(currentSentenceBeginning) && currentSentenceBeginning === nextSentenceBeginning;\n};\n\n/**\n * Counts the number of similar sentence beginnings.\n *\n * @param {Array} sentenceBeginnings The array containing the first word of each sentence.\n * @param {Array} sentences The array containing all sentences.\n * @returns {Array} The array containing the objects containing the first words and the corresponding counts.\n */\nconst compareFirstWords = function(sentenceBeginnings, sentences) {\n const consecutiveFirstWords = [];\n let foundSentences = [];\n let sameBeginnings = 1;\n\n forEach(sentenceBeginnings, function(beginning, i) {\n const currentSentenceBeginning = beginning;\n const nextSentenceBeginning = sentenceBeginnings[i + 1];\n foundSentences.push(sentences[i]);\n\n if (startsWithSameWord(currentSentenceBeginning, nextSentenceBeginning)) {\n sameBeginnings++;\n } else {\n consecutiveFirstWords.push({\n word: currentSentenceBeginning,\n count: sameBeginnings,\n sentences: foundSentences\n });\n sameBeginnings = 1;\n foundSentences = [];\n }\n });\n\n return consecutiveFirstWords;\n};\n\n/**\n * Retrieves the first word from the sentence. If the first or second word is on an exception list of words that should not be considered as sentence\n * beginnings, the following word is also retrieved.\n *\n * @param {string} sentence The sentence to retrieve the first word from.\n * @param {Array} firstWordExceptions First word exceptions to match against.\n * @param {Array} secondWordExceptions Second word exceptions to match against.\n * @param {function}\tgetWordsCustomHelper The language-specific helper function to retrieve words from text.\n *\n * @returns {string} The first word of the sentence.\n */\nfunction getSentenceBeginning(\n sentence,\n firstWordExceptions,\n secondWordExceptions,\n getWordsCustomHelper\n) {\n const stripped = stripTags(stripSpaces(sentence));\n let words = getWordsCustomHelper ? getWordsCustomHelper(stripped) : getWords(stripped);\n\n words = words.filter(word => /^\\p{L}/u.test(word));\n\n if (words.length === 0) {\n return '';\n }\n\n let firstWord = words[0].toLocaleLowerCase();\n\n if (firstWordExceptions.indexOf(firstWord) > -1 && words.length > 1) {\n firstWord = firstWord + ' ' + words[1];\n if (secondWordExceptions) {\n if (secondWordExceptions.includes(words[1])) {\n firstWord = firstWord + ' ' + words[2];\n }\n }\n }\n\n return firstWord;\n}\n\n/**\n * Gets the first word of each sentence from the text, and returns an object containing the first word of each sentence and the corresponding counts.\n *\n * @param {Paper} paper The Paper object to get the text from.\n * @param {Researcher} researcher The researcher this research is a part of.\n *\n * @returns {Object} The object containing the first word of each sentence and the corresponding counts.\n */\nexport default function(paper, researcher) {\n const firstWordExceptions = researcher.getConfig('firstWordExceptions');\n const secondWordExceptions = researcher.getConfig('secondWordExceptions');\n const getWordsCustomHelper = researcher.getHelper('getWordsCustomHelper');\n const memoizedTokenizer = researcher.getHelper('memoizedTokenizer');\n\n let text = paper.getText();\n text = removeHtmlBlocks(text);\n text = stripNonTextTags(text);\n text = filterShortcodesFromHTML(text, paper._attributes && paper._attributes.shortcodes);\n\n // Remove any HTML whitespace padding and replace it with a single whitespace.\n text = text.replace(/[\\s\\n]+/g, ' ');\n\n // Exclude text inside tables.\n text = text.replace(/<figure class='wp-block-table'>.*<\\/figure>/gs, '');\n\n let sentences = getSentences(text, memoizedTokenizer);\n\n let sentenceBeginnings = sentences.map(function(sentence) {\n return getSentenceBeginning(\n sentence,\n firstWordExceptions,\n secondWordExceptions,\n getWordsCustomHelper\n );\n });\n\n sentences = sentences.filter(function(sentence) {\n const stripped = stripSpaces(sentence);\n const words = getWordsCustomHelper ? getWordsCustomHelper(stripped) : getWords(stripped);\n return words.length > 0;\n });\n sentenceBeginnings = filter(sentenceBeginnings);\n\n return compareFirstWords(sentenceBeginnings, sentences);\n}\n"],"mappings":"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","ignoreList":[]}
|