axyseo 2.0.0-alpha.0.0.44 → 2.0.0-alpha.0.0.47
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/matchKeywordInSubheadings.js +5 -5
- package/build/languageProcessing/researches/matchKeywordInSubheadings.js.map +1 -1
- package/build/scoring/assessments/seo/UrlKeywordAssessment.js +1 -4
- package/build/scoring/assessments/seo/UrlKeywordAssessment.js.map +1 -1
- package/build/scoring/assessors/avadaAssessor.js +0 -1
- package/build/scoring/assessors/avadaAssessor.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getSubheadingContents } from "../helpers/html/getSubheadings";
|
|
2
2
|
import stripSomeTags from "../helpers/sanitize/stripNonTextTags";
|
|
3
3
|
import { findTopicFormsInString } from "../helpers/match/findKeywordFormsInString";
|
|
4
4
|
import removeHtmlBlocks from "../helpers/html/htmlParser";
|
|
@@ -35,15 +35,15 @@ const numberOfSubheadingsReflectingTopic = function (topicForms, subheadings, us
|
|
|
35
35
|
* @returns {Object} The result object.
|
|
36
36
|
*/
|
|
37
37
|
export default function matchKeywordInSubheadings(paper, researcher) {
|
|
38
|
-
const functionWords = researcher.getConfig(
|
|
38
|
+
const functionWords = researcher.getConfig('functionWords');
|
|
39
39
|
|
|
40
40
|
// A custom helper to match word in text.
|
|
41
|
-
const matchWordCustomHelper = researcher.getHelper(
|
|
41
|
+
const matchWordCustomHelper = researcher.getHelper('matchWordCustomHelper');
|
|
42
42
|
let text = paper.getText();
|
|
43
43
|
text = removeHtmlBlocks(text);
|
|
44
44
|
text = filterShortcodesFromHTML(text, paper._attributes && paper._attributes.shortcodes);
|
|
45
45
|
text = stripSomeTags(text);
|
|
46
|
-
const topicForms = researcher.getResearch(
|
|
46
|
+
const topicForms = researcher.getResearch('morphology');
|
|
47
47
|
const locale = paper.getLocale();
|
|
48
48
|
const result = {
|
|
49
49
|
count: 0,
|
|
@@ -51,7 +51,7 @@ export default function matchKeywordInSubheadings(paper, researcher) {
|
|
|
51
51
|
percentReflectingTopic: 0
|
|
52
52
|
};
|
|
53
53
|
const useSynonyms = true;
|
|
54
|
-
const subheadings =
|
|
54
|
+
const subheadings = getSubheadingContents(text);
|
|
55
55
|
if (subheadings.length !== 0) {
|
|
56
56
|
result.count = subheadings.length;
|
|
57
57
|
result.matches = numberOfSubheadingsReflectingTopic(topicForms, subheadings, useSynonyms, locale, functionWords, matchWordCustomHelper);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matchKeywordInSubheadings.js","names":["
|
|
1
|
+
{"version":3,"file":"matchKeywordInSubheadings.js","names":["getSubheadingContents","stripSomeTags","findTopicFormsInString","removeHtmlBlocks","filterShortcodesFromHTML","numberOfSubheadingsReflectingTopic","topicForms","subheadings","useSynonyms","locale","functionWords","matchWordCustomHelper","filter","subheading","matchedTopicForms","length","percentWordMatches","matchKeywordInSubheadings","paper","researcher","getConfig","getHelper","text","getText","_attributes","shortcodes","getResearch","getLocale","result","count","matches","percentReflectingTopic"],"sources":["../../../src/languageProcessing/researches/matchKeywordInSubheadings.js"],"sourcesContent":["import {getSubheadingContents} from '../helpers/html/getSubheadings';\nimport stripSomeTags from '../helpers/sanitize/stripNonTextTags';\nimport {findTopicFormsInString} from '../helpers/match/findKeywordFormsInString';\nimport removeHtmlBlocks from '../helpers/html/htmlParser';\nimport {filterShortcodesFromHTML} from '../helpers';\n\n/**\n * Computes the amount of subheadings reflecting the topic.\n *\n * @param {Object} topicForms The main key phrase and its synonyms to check.\n * @param {string[]} subheadings The subheadings to check.\n * @param {boolean} useSynonyms Whether to match synonyms or only main keyphrase.\n * @param {string} locale The current locale.\n * @param {Array} functionWords\tThe function words list.\n * @param {function} matchWordCustomHelper The language-specific helper function to match word in text.\n *\n * @returns {number} The amount of subheadings reflecting the topic.\n */\nconst numberOfSubheadingsReflectingTopic = function(\n topicForms,\n subheadings,\n useSynonyms,\n locale,\n functionWords,\n matchWordCustomHelper\n) {\n return subheadings.filter(subheading => {\n const matchedTopicForms = findTopicFormsInString(\n topicForms,\n subheading,\n useSynonyms,\n locale,\n matchWordCustomHelper\n );\n\n if (functionWords.length === 0) {\n return matchedTopicForms.percentWordMatches === 100;\n }\n return matchedTopicForms.percentWordMatches > 50;\n }).length;\n};\n\n/**\n * Checks if there are any h2 or h3 subheadings in the text and if they have the keyphrase or synonyms in them.\n *\n * @param {Object} paper The paper object containing the text and keyword.\n * @param {Researcher} researcher The researcher object.\n *\n * @returns {Object} The result object.\n */\nexport default function matchKeywordInSubheadings(paper, researcher) {\n const functionWords = researcher.getConfig('functionWords');\n\n // A custom helper to match word in text.\n const matchWordCustomHelper = researcher.getHelper('matchWordCustomHelper');\n\n let text = paper.getText();\n text = removeHtmlBlocks(text);\n text = filterShortcodesFromHTML(text, paper._attributes && paper._attributes.shortcodes);\n text = stripSomeTags(text);\n const topicForms = researcher.getResearch('morphology');\n const locale = paper.getLocale();\n const result = {count: 0, matches: 0, percentReflectingTopic: 0};\n const useSynonyms = true;\n const subheadings = getSubheadingContents(text);\n\n if (subheadings.length !== 0) {\n result.count = subheadings.length;\n result.matches = numberOfSubheadingsReflectingTopic(\n topicForms,\n subheadings,\n useSynonyms,\n locale,\n functionWords,\n matchWordCustomHelper\n );\n result.percentReflectingTopic = (result.matches / result.count) * 100;\n }\n\n return result;\n}\n"],"mappings":"AAAA,SAAQA,qBAAqB;AAC7B,OAAOC,aAAa;AACpB,SAAQC,sBAAsB;AAC9B,OAAOC,gBAAgB;AACvB,SAAQC,wBAAwB;;AAEhC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,kCAAkC,GAAG,SAAAA,CACzCC,UAAU,EACVC,WAAW,EACXC,WAAW,EACXC,MAAM,EACNC,aAAa,EACbC,qBAAqB,EACrB;EACA,OAAOJ,WAAW,CAACK,MAAM,CAACC,UAAU,IAAI;IACtC,MAAMC,iBAAiB,GAAGZ,sBAAsB,CAC9CI,UAAU,EACVO,UAAU,EACVL,WAAW,EACXC,MAAM,EACNE,qBACF,CAAC;IAED,IAAID,aAAa,CAACK,MAAM,KAAK,CAAC,EAAE;MAC9B,OAAOD,iBAAiB,CAACE,kBAAkB,KAAK,GAAG;IACrD;IACA,OAAOF,iBAAiB,CAACE,kBAAkB,GAAG,EAAE;EAClD,CAAC,CAAC,CAACD,MAAM;AACX,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASE,yBAAyBA,CAACC,KAAK,EAAEC,UAAU,EAAE;EACnE,MAAMT,aAAa,GAAGS,UAAU,CAACC,SAAS,CAAC,eAAe,CAAC;;EAE3D;EACA,MAAMT,qBAAqB,GAAGQ,UAAU,CAACE,SAAS,CAAC,uBAAuB,CAAC;EAE3E,IAAIC,IAAI,GAAGJ,KAAK,CAACK,OAAO,CAAC,CAAC;EAC1BD,IAAI,GAAGnB,gBAAgB,CAACmB,IAAI,CAAC;EAC7BA,IAAI,GAAGlB,wBAAwB,CAACkB,IAAI,EAAEJ,KAAK,CAACM,WAAW,IAAIN,KAAK,CAACM,WAAW,CAACC,UAAU,CAAC;EACxFH,IAAI,GAAGrB,aAAa,CAACqB,IAAI,CAAC;EAC1B,MAAMhB,UAAU,GAAGa,UAAU,CAACO,WAAW,CAAC,YAAY,CAAC;EACvD,MAAMjB,MAAM,GAAGS,KAAK,CAACS,SAAS,CAAC,CAAC;EAChC,MAAMC,MAAM,GAAG;IAACC,KAAK,EAAE,CAAC;IAAEC,OAAO,EAAE,CAAC;IAAEC,sBAAsB,EAAE;EAAC,CAAC;EAChE,MAAMvB,WAAW,GAAG,IAAI;EACxB,MAAMD,WAAW,GAAGP,qBAAqB,CAACsB,IAAI,CAAC;EAE/C,IAAIf,WAAW,CAACQ,MAAM,KAAK,CAAC,EAAE;IAC5Ba,MAAM,CAACC,KAAK,GAAGtB,WAAW,CAACQ,MAAM;IACjCa,MAAM,CAACE,OAAO,GAAGzB,kCAAkC,CACjDC,UAAU,EACVC,WAAW,EACXC,WAAW,EACXC,MAAM,EACNC,aAAa,EACbC,qBACF,CAAC;IACDiB,MAAM,CAACG,sBAAsB,GAAIH,MAAM,CAACE,OAAO,GAAGF,MAAM,CAACC,KAAK,GAAI,GAAG;EACvE;EAEA,OAAOD,MAAM;AACf","ignoreList":[]}
|
|
@@ -77,10 +77,7 @@ class SlugKeywordAssessment extends Assessment {
|
|
|
77
77
|
*/
|
|
78
78
|
calculateResult(i18n) {
|
|
79
79
|
const status = (() => {
|
|
80
|
-
|
|
81
|
-
return this._keywordInSlug.percentWordMatches === 100 ? 'good' : 'bad';
|
|
82
|
-
}
|
|
83
|
-
return this._keywordInSlug.percentWordMatches > 50 ? 'good' : 'bad';
|
|
80
|
+
return this._keywordInSlug.percentWordMatches >= 50 ? 'good' : 'bad';
|
|
84
81
|
})();
|
|
85
82
|
const score = this.getScore(this._config.priority, status);
|
|
86
83
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UrlKeywordAssessment.js","names":["React","Text","merge","Assessment","AssessmentResult","SlugKeywordAssessment","constructor","config","defaultConfig","id","docUrl","fixPosition","ctaType","priority","title","content","good","improve","bad","identifier","_config","getResult","paper","researcher","i18n","_keywordInSlug","getResearch","assessmentResult","calculatedResult","calculateResult","setScore","score","setStatus","status","setBody","body","isApplicable","isFrontPage","hasKeyword","hasSlug","hasResearch","
|
|
1
|
+
{"version":3,"file":"UrlKeywordAssessment.js","names":["React","Text","merge","Assessment","AssessmentResult","SlugKeywordAssessment","constructor","config","defaultConfig","id","docUrl","fixPosition","ctaType","priority","title","content","good","improve","bad","identifier","_config","getResult","paper","researcher","i18n","_keywordInSlug","getResearch","assessmentResult","calculatedResult","calculateResult","setScore","score","setStatus","status","setBody","body","isApplicable","isFrontPage","hasKeyword","hasSlug","hasResearch","percentWordMatches","getScore","createElement","as","href","target","rel","translate"],"sources":["../../../../src/scoring/assessments/seo/UrlKeywordAssessment.js"],"sourcesContent":["import React from 'react';\nimport {Text} from '@shopify/polaris';\nimport {merge} from 'lodash';\n\nimport Assessment from '../assessment';\nimport AssessmentResult from '../../../values/AssessmentResult';\n\n/**\n * Represents the Slug keyword assessment. This assessment checks if the keyword is present in the slug.\n */\nclass SlugKeywordAssessment extends Assessment {\n /**\n * Sets the identifier and the config.\n *\n * @param {Object} config The configuration to use.\n * @returns {void}\n */\n constructor(config = {}) {\n super();\n\n const defaultConfig = {\n id: 'slugKeyword',\n docUrl:\n 'https://docs.avada.io/seo-suite-help-center/seo-audit/on-page-seo/checklist#keyword-in-url',\n fixPosition: 'url handle',\n ctaType: 'fix',\n priority: 'medium',\n title: 'Keyword in URL',\n content: {\n good: 'Keyword is included in URL.',\n improve: '',\n bad: 'Missing keyword in URL. Include it for relevance and better SEO.'\n }\n };\n\n this.identifier = 'slugKeyword';\n this._config = merge(defaultConfig, config);\n }\n\n /**\n * Executes the Assessment and returns a result.\n *\n * @param {Paper} paper The Paper object to assess.\n * @param {Researcher} researcher The Researcher object containing all available researches.\n *\n * @param i18n\n * @returns {AssessmentResult} The result of the assessment, containing both a score and a descriptive text.\n */\n getResult({paper, researcher, i18n}) {\n this._keywordInSlug = researcher.getResearch('keywordCountInSlug');\n\n const assessmentResult = new AssessmentResult({config: this._config});\n\n const calculatedResult = this.calculateResult(i18n);\n\n assessmentResult.setScore(calculatedResult.score);\n assessmentResult.setStatus(calculatedResult.status);\n assessmentResult.setBody(calculatedResult.body);\n return assessmentResult;\n }\n\n /**\n * Checks whether the paper has a keyword and a slug.\n *\n * @param {Paper} paper The paper to use for the assessment.\n * @param {Researcher} researcher The researcher object.\n *\n * @returns {boolean} True if the paper contains a keyword and a slug, and if the keywordCountInSlug research is available on the researcher.\n */\n isApplicable(paper, researcher) {\n return (\n !paper.isFrontPage() &&\n paper.hasKeyword() &&\n paper.hasSlug() &&\n researcher.hasResearch('keywordCountInSlug')\n );\n }\n\n /**\n *\n * @param i18n\n * @returns {{score: number, body: React.JSX.Element, status: string}}\n */\n calculateResult(i18n) {\n const status = (() => {\n return this._keywordInSlug.percentWordMatches >= 50 ? 'good' : 'bad';\n })();\n\n const score = this.getScore(this._config.priority, status);\n\n return {\n score,\n status,\n body: (\n <Text as={'span'}>\n {this._config.content[status]}{' '}\n {this._config.docUrl && (\n <a href={this._config.docUrl} target=\"_blank\" rel=\"noreferrer\">\n {i18n ? i18n.translate(`Axyseo.Button.learnMore`) : 'Learn more'}\n </a>\n )}\n </Text>\n )\n };\n }\n}\n\nexport default SlugKeywordAssessment;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avadaAssessor.js","names":["ContentAssessor","SEOAssessor","getMaxPoint","groupAssessmentsByCategory","groupAssessmentsByStatus","AvadaAssessor","constructor","researcher","config","seoAssessor","contentAssessor","assess","paper","i18n","assessments","results","map","assessment","body","status","score","title","getResult","groupBy","getScore","point","
|
|
1
|
+
{"version":3,"file":"avadaAssessor.js","names":["ContentAssessor","SEOAssessor","getMaxPoint","groupAssessmentsByCategory","groupAssessmentsByStatus","AvadaAssessor","constructor","researcher","config","seoAssessor","contentAssessor","assess","paper","i18n","assessments","results","map","assessment","body","status","score","title","getResult","groupBy","getScore","point","forEach","maxPoint","Math","round"],"sources":["../../../src/scoring/assessors/avadaAssessor.js"],"sourcesContent":["import {ContentAssessor, SEOAssessor} from '@axyseo/scoring/assessors/index';\nimport {getMaxPoint, groupAssessmentsByCategory, groupAssessmentsByStatus} from '../helpers';\n\n/**\n * The AvadaAssessor class is used for the general SEO analysis.\n */\nexport default class AvadaAssessor {\n /**\n * Creates a new AvadaAssessor instance.\n * @param {Researcher} researcher The researcher to use.\n * @param {Object} [config] The assessor config.\n * @param {Object} [config.textParagraphTooLong]\n * @param {Object} [config.textSentenceLength]\n * @param {Object} [config.textTransitionWords]\n * @param {Object} [config.sentenceBeginnings]\n * @param {Object} [config.relatedKeywords]\n * @param {Object} [config.titleKeyword]\n * @param {Object} [config.textImages]\n * @param {Object} [config.numberTitle]\n * @param {Object} [config.introductionKeyword]\n * @param {Object} [config.keyphraseLength]\n * @param {Object} [config.metaDescriptionKeyword]\n * @param {Object} [config.metaDescriptionLength]\n * @param {Object} [config.subheadingsKeyword]\n * @param {Object} [config.externalLinks]\n * @param {Object} [config.keyphraseDensity]\n * @param {Object} [config.media]\n * @param {Object} [config.urlLength]\n * @param {Object} [config.textLength]\n * @param {Object} [config.singleTitle]\n * @param {Object} [config.keyphrase]\n * @param {Object} [config.internalLinks]\n * @param {Object} [config.titleWidth]\n * @param {Object} [config.slugKeyword]\n * @param {Object} [config.singleH1]\n * @param {Object} [config.schema]\n */\n constructor(researcher, config = {}) {\n const seoAssessor = new SEOAssessor(researcher, config);\n const contentAssessor = new ContentAssessor(researcher, config);\n this.seoAssessor = seoAssessor;\n this.contentAssessor = contentAssessor;\n this.researcher = researcher;\n this.config = config;\n }\n\n assess(paper, i18n) {\n this.seoAssessor.assess(paper, i18n);\n this.contentAssessor.assess(paper, i18n);\n\n let assessments = [...this.seoAssessor.results, ...this.contentAssessor.results];\n assessments = assessments.map(assessment => ({\n ...assessment.config,\n body: assessment.body,\n status: assessment.status,\n score: assessment.score,\n title: assessment.title || assessment.config.title\n }));\n this.assessments = assessments;\n }\n\n getResult(groupBy = 'category', getScore = true) {\n let assessments = [];\n switch (groupBy) {\n case 'category':\n assessments = groupAssessmentsByCategory(this.assessments);\n break;\n case 'status':\n assessments = groupAssessmentsByStatus(this.assessments);\n break;\n }\n\n return {\n assessments,\n ...(getScore ? {score: this.getScore()} : {})\n };\n }\n\n getScore() {\n let point = 0;\n this.assessments.forEach(assessment => {\n point += assessment.score;\n });\n\n const maxPoint = getMaxPoint(this.assessments);\n return Math.round((point * 100) / maxPoint);\n }\n}\n"],"mappings":"AAAA,SAAQA,eAAe,EAAEC,WAAW;AACpC,SAAQC,WAAW,EAAEC,0BAA0B,EAAEC,wBAAwB;;AAEzE;AACA;AACA;AACA,eAAe,MAAMC,aAAa,CAAC;EACjC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,WAAWA,CAACC,UAAU,EAAEC,MAAM,GAAG,CAAC,CAAC,EAAE;IACnC,MAAMC,WAAW,GAAG,IAAIR,WAAW,CAACM,UAAU,EAAEC,MAAM,CAAC;IACvD,MAAME,eAAe,GAAG,IAAIV,eAAe,CAACO,UAAU,EAAEC,MAAM,CAAC;IAC/D,IAAI,CAACC,WAAW,GAAGA,WAAW;IAC9B,IAAI,CAACC,eAAe,GAAGA,eAAe;IACtC,IAAI,CAACH,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACC,MAAM,GAAGA,MAAM;EACtB;EAEAG,MAAMA,CAACC,KAAK,EAAEC,IAAI,EAAE;IAClB,IAAI,CAACJ,WAAW,CAACE,MAAM,CAACC,KAAK,EAAEC,IAAI,CAAC;IACpC,IAAI,CAACH,eAAe,CAACC,MAAM,CAACC,KAAK,EAAEC,IAAI,CAAC;IAExC,IAAIC,WAAW,GAAG,CAAC,GAAG,IAAI,CAACL,WAAW,CAACM,OAAO,EAAE,GAAG,IAAI,CAACL,eAAe,CAACK,OAAO,CAAC;IAChFD,WAAW,GAAGA,WAAW,CAACE,GAAG,CAACC,UAAU,KAAK;MAC3C,GAAGA,UAAU,CAACT,MAAM;MACpBU,IAAI,EAAED,UAAU,CAACC,IAAI;MACrBC,MAAM,EAAEF,UAAU,CAACE,MAAM;MACzBC,KAAK,EAAEH,UAAU,CAACG,KAAK;MACvBC,KAAK,EAAEJ,UAAU,CAACI,KAAK,IAAIJ,UAAU,CAACT,MAAM,CAACa;IAC/C,CAAC,CAAC,CAAC;IACH,IAAI,CAACP,WAAW,GAAGA,WAAW;EAChC;EAEAQ,SAASA,CAACC,OAAO,GAAG,UAAU,EAAEC,QAAQ,GAAG,IAAI,EAAE;IAC/C,IAAIV,WAAW,GAAG,EAAE;IACpB,QAAQS,OAAO;MACb,KAAK,UAAU;QACbT,WAAW,GAAGX,0BAA0B,CAAC,IAAI,CAACW,WAAW,CAAC;QAC1D;MACF,KAAK,QAAQ;QACXA,WAAW,GAAGV,wBAAwB,CAAC,IAAI,CAACU,WAAW,CAAC;QACxD;IACJ;IAEA,OAAO;MACLA,WAAW;MACX,IAAIU,QAAQ,GAAG;QAACJ,KAAK,EAAE,IAAI,CAACI,QAAQ,CAAC;MAAC,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;EACH;EAEAA,QAAQA,CAAA,EAAG;IACT,IAAIC,KAAK,GAAG,CAAC;IACb,IAAI,CAACX,WAAW,CAACY,OAAO,CAACT,UAAU,IAAI;MACrCQ,KAAK,IAAIR,UAAU,CAACG,KAAK;IAC3B,CAAC,CAAC;IAEF,MAAMO,QAAQ,GAAGzB,WAAW,CAAC,IAAI,CAACY,WAAW,CAAC;IAC9C,OAAOc,IAAI,CAACC,KAAK,CAAEJ,KAAK,GAAG,GAAG,GAAIE,QAAQ,CAAC;EAC7C;AACF","ignoreList":[]}
|