axyseo 2.1.10 → 2.1.12
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/index.js +3 -1
- package/build/index.js.map +1 -1
- package/build/languageProcessing/researches/checkRelatedKeywords.js +2 -1
- package/build/languageProcessing/researches/checkRelatedKeywords.js.map +1 -1
- package/build/scoring/assessments/seo/SingleH1Assessment.js +1 -0
- package/build/scoring/assessments/seo/SingleH1Assessment.js.map +1 -1
- package/build/scoring/assessors/assessor.js.map +1 -1
- package/build/scoring/assessors/avadaAssessor.js.map +1 -1
- package/package.json +2 -2
package/build/index.js
CHANGED
|
@@ -13,6 +13,7 @@ import Paper from "./values/Paper";
|
|
|
13
13
|
import AssessmentResult from "./values/AssessmentResult";
|
|
14
14
|
import Assessment from "./scoring/assessments/assessment";
|
|
15
15
|
import { DIFFICULTY } from "./languageProcessing/researches/getFleschReadingScore";
|
|
16
|
+
import * as CONSTANT from "./const/analysis";
|
|
16
17
|
import Factory from "./helpers/factory";
|
|
17
18
|
|
|
18
19
|
/*
|
|
@@ -36,6 +37,7 @@ export default {
|
|
|
36
37
|
markers,
|
|
37
38
|
interpreters,
|
|
38
39
|
languageProcessing,
|
|
39
|
-
values
|
|
40
|
+
values,
|
|
41
|
+
CONSTANT
|
|
40
42
|
};
|
|
41
43
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["assessments","helpers","markers","interpreters","languageProcessing","values","assessors","Assessor","AvadaAssessor","ContentAssessor","SeoAssessor","Paper","AssessmentResult","Assessment","DIFFICULTY","Factory"],"sources":["../src/index.js"],"sourcesContent":["import * as assessments from './scoring/assessments';\nimport * as helpers from './helpers';\nimport * as markers from './markers';\nimport * as interpreters from './scoring/interpreters';\nimport * as languageProcessing from './languageProcessing';\nimport * as values from './values';\nimport * as assessors from './scoring/assessors';\nimport Assessor from './scoring/assessors/assessor';\nimport AvadaAssessor from './scoring/assessors/avadaAssessor';\nimport ContentAssessor from './scoring/assessors/contentAssessor';\nimport SeoAssessor from './scoring/assessors/seoAssessor';\nimport Paper from './values/Paper';\nimport AssessmentResult from './values/AssessmentResult';\nimport Assessment from './scoring/assessments/assessment';\nimport {DIFFICULTY} from './languageProcessing/researches/getFleschReadingScore';\n\nimport Factory from './helpers/factory';\n\n/*\n * Everything exported here is put on the `yoast.analysis` global in the plugin.\n */\nexport {\n Assessor,\n ContentAssessor,\n SeoAssessor,\n AvadaAssessor,\n Paper,\n AssessmentResult,\n Assessment,\n assessments,\n assessors,\n helpers,\n markers,\n interpreters,\n languageProcessing,\n values,\n DIFFICULTY,\n Factory\n};\n\n/*\n * Used for backwards compatibility reasons.\n * For new exports, please add it as a named dependency above instead.\n */\nexport default {\n Assessor,\n ContentAssessor,\n SeoAssessor,\n AvadaAssessor,\n\n Paper,\n AssessmentResult,\n\n assessments,\n helpers,\n markers,\n interpreters,\n languageProcessing,\n values\n};\n"],"mappings":"AAAA,OAAO,KAAKA,WAAW;AACvB,OAAO,KAAKC,OAAO;AACnB,OAAO,KAAKC,OAAO;AACnB,OAAO,KAAKC,YAAY;AACxB,OAAO,KAAKC,kBAAkB;AAC9B,OAAO,KAAKC,MAAM;AAClB,OAAO,KAAKC,SAAS;AACrB,OAAOC,QAAQ;AACf,OAAOC,aAAa;AACpB,OAAOC,eAAe;AACtB,OAAOC,WAAW;AAClB,OAAOC,KAAK;AACZ,OAAOC,gBAAgB;AACvB,OAAOC,UAAU;AACjB,SAAQC,UAAU;
|
|
1
|
+
{"version":3,"file":"index.js","names":["assessments","helpers","markers","interpreters","languageProcessing","values","assessors","Assessor","AvadaAssessor","ContentAssessor","SeoAssessor","Paper","AssessmentResult","Assessment","DIFFICULTY","CONSTANT","Factory"],"sources":["../src/index.js"],"sourcesContent":["import * as assessments from './scoring/assessments';\nimport * as helpers from './helpers';\nimport * as markers from './markers';\nimport * as interpreters from './scoring/interpreters';\nimport * as languageProcessing from './languageProcessing';\nimport * as values from './values';\nimport * as assessors from './scoring/assessors';\nimport Assessor from './scoring/assessors/assessor';\nimport AvadaAssessor from './scoring/assessors/avadaAssessor';\nimport ContentAssessor from './scoring/assessors/contentAssessor';\nimport SeoAssessor from './scoring/assessors/seoAssessor';\nimport Paper from './values/Paper';\nimport AssessmentResult from './values/AssessmentResult';\nimport Assessment from './scoring/assessments/assessment';\nimport {DIFFICULTY} from './languageProcessing/researches/getFleschReadingScore';\nimport * as CONSTANT from './const/analysis'\n\nimport Factory from './helpers/factory';\n\n/*\n * Everything exported here is put on the `yoast.analysis` global in the plugin.\n */\nexport {\n Assessor,\n ContentAssessor,\n SeoAssessor,\n AvadaAssessor,\n Paper,\n AssessmentResult,\n Assessment,\n assessments,\n assessors,\n helpers,\n markers,\n interpreters,\n languageProcessing,\n values,\n DIFFICULTY,\n Factory\n};\n\n/*\n * Used for backwards compatibility reasons.\n * For new exports, please add it as a named dependency above instead.\n */\nexport default {\n Assessor,\n ContentAssessor,\n SeoAssessor,\n AvadaAssessor,\n\n Paper,\n AssessmentResult,\n\n assessments,\n helpers,\n markers,\n interpreters,\n languageProcessing,\n values,\n CONSTANT\n};\n"],"mappings":"AAAA,OAAO,KAAKA,WAAW;AACvB,OAAO,KAAKC,OAAO;AACnB,OAAO,KAAKC,OAAO;AACnB,OAAO,KAAKC,YAAY;AACxB,OAAO,KAAKC,kBAAkB;AAC9B,OAAO,KAAKC,MAAM;AAClB,OAAO,KAAKC,SAAS;AACrB,OAAOC,QAAQ;AACf,OAAOC,aAAa;AACpB,OAAOC,eAAe;AACtB,OAAOC,WAAW;AAClB,OAAOC,KAAK;AACZ,OAAOC,gBAAgB;AACvB,OAAOC,UAAU;AACjB,SAAQC,UAAU;AAClB,OAAO,KAAKC,QAAQ;AAEpB,OAAOC,OAAO;;AAEd;AACA;AACA;AACA,SACET,QAAQ,EACRE,eAAe,EACfC,WAAW,EACXF,aAAa,EACbG,KAAK,EACLC,gBAAgB,EAChBC,UAAU,EACVb,WAAW,EACXM,SAAS,EACTL,OAAO,EACPC,OAAO,EACPC,YAAY,EACZC,kBAAkB,EAClBC,MAAM,EACNS,UAAU,EACVE,OAAO;;AAGT;AACA;AACA;AACA;AACA,eAAe;EACbT,QAAQ;EACRE,eAAe;EACfC,WAAW;EACXF,aAAa;EAEbG,KAAK;EACLC,gBAAgB;EAEhBZ,WAAW;EACXC,OAAO;EACPC,OAAO;EACPC,YAAY;EACZC,kBAAkB;EAClBC,MAAM;EACNU;AACF,CAAC","ignoreList":[]}
|
|
@@ -29,7 +29,7 @@ export const transformRelatedKeyword = keywords => keywords.map(keyword => typeo
|
|
|
29
29
|
const getTextFullPage = data => {
|
|
30
30
|
const faqString = data.faqs.status ? data.faqs.questions.map(i => i.question + ' ' + i.answer).join(' ') : '';
|
|
31
31
|
const html = data.body_html || data.descriptionHtml;
|
|
32
|
-
const bodyString = html?.length > 0 ? html.replace(/<\/?[^>]+(>|$)/g, ' ') : '';
|
|
32
|
+
const bodyString = html?.length > 0 ? html.replace(/<\/?[^>]+(>|$)/g, ' ').replace(/\s+/g, ' ').trim() : '';
|
|
33
33
|
return [faqString, data.title, bodyString, data?.metafields_avadaSEO_after_content, data.metafields_global_title_tag, data.metafields_global_description_tag].join(' ').toLowerCase();
|
|
34
34
|
};
|
|
35
35
|
const escapeRegExp = string => {
|
|
@@ -46,6 +46,7 @@ const countWordsInRelatedKeywords = ({
|
|
|
46
46
|
related_keywords,
|
|
47
47
|
string
|
|
48
48
|
}) => {
|
|
49
|
+
console.log('🚀 ~ countWordsInRelatedKeywords ~ string:', string);
|
|
49
50
|
const total = string.split(/\s+/).filter(word => word.length > 0).length;
|
|
50
51
|
const words = {};
|
|
51
52
|
let totalWordUsed = 0;
|
|
@@ -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","escapeRegExp","total","split","filter","word","words","totalWordUsed","isWordUsedExceeding","forEach","toLocaleLowerCase","escapedKeyword","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
|
|
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","trim","title","metafields_avadaSEO_after_content","metafields_global_title_tag","metafields_global_description_tag","toLowerCase","escapeRegExp","console","log","total","split","filter","word","words","totalWordUsed","isWordUsedExceeding","forEach","toLocaleLowerCase","escapedKeyword","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 =\n html?.length > 0\n ? html\n .replace(/<\\/?[^>]+(>|$)/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n : '';\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\nconst escapeRegExp = string => {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\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 console.log('🚀 ~ countWordsInRelatedKeywords ~ string:', 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 const escapedKeyword = escapeRegExp(keyword);\n const regex = new RegExp(`(?:^|\\\\W)${escapedKeyword}(?:\\\\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":"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","ignoreList":[]}
|
|
@@ -65,6 +65,7 @@ class SingleH1Assessment extends Assessment {
|
|
|
65
65
|
calculateResult(paper) {
|
|
66
66
|
const htmlString = paper.getText();
|
|
67
67
|
const desHasH1Tag = htmlString.includes('<h1>');
|
|
68
|
+
console.log('calculateResult h1', htmlString, desHasH1Tag);
|
|
68
69
|
let status = '';
|
|
69
70
|
if (this._h1Count === 1) {
|
|
70
71
|
status = 'good';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SingleH1Assessment.js","names":["isUndefined","merge","Assessment","AssessmentResult","SINGLE_H1_ID","SingleH1Assessment","constructor","config","defaultConfig","id","docUrl","fixPosition","ctaType","priority","title","content","good","improve","bad","identifier","_config","getResult","paper","researcher","_h1Count","getResearch","assessmentResult","calculatedResult","calculateResult","setScore","score","setStatus","status","htmlString","getText","desHasH1Tag","includes","getScore","isApplicable","hasText"],"sources":["../../../../src/scoring/assessments/seo/SingleH1Assessment.js"],"sourcesContent":["import {isUndefined, merge} from 'lodash';\nimport Assessment from '../assessment.js';\nimport AssessmentResult from '../../../values/AssessmentResult.js';\nimport {SINGLE_H1_ID} from '@axyseo/const/analysis';\n\n/**\n * Assessment to check whether the body of the text contains more than 1 H1s in the body.\n * This assessment doesn't penalize H1 that is not in the very beginning of the body.\n */\nclass SingleH1Assessment extends Assessment {\n /**\n * Sets the identifier and the config.\n *\n * @param {Object} config The configuration to use.\n *\n * @returns {void}\n */\n constructor(config = {}) {\n super();\n\n const defaultConfig = {\n id: SINGLE_H1_ID,\n docUrl: 'https://help.seoon.io/seo/seo-checklist',\n fixPosition: 'description',\n ctaType: 'contactUs',\n priority: 'high',\n title: 'H1 tag',\n content: {\n good: 'H1 tag is optimized.',\n improve: 'You should use only one H1 tag',\n bad: 'Missing H1 tag. Add one H1 to clearly define your page`s topic.'\n }\n };\n\n this.identifier = SINGLE_H1_ID;\n this._config = merge(defaultConfig, config);\n }\n\n /**\n * Runs the h1 research and based on this returns an assessment result with a score.\n *\n * @param {Paper} paper The paper to use for the assessment.\n * @param {Researcher} researcher The researcher used for calling the research.\n * @returns {AssessmentResult} The assessment result.\n */\n getResult({paper, researcher}) {\n this._h1Count = researcher.getResearch('h1s');\n
|
|
1
|
+
{"version":3,"file":"SingleH1Assessment.js","names":["isUndefined","merge","Assessment","AssessmentResult","SINGLE_H1_ID","SingleH1Assessment","constructor","config","defaultConfig","id","docUrl","fixPosition","ctaType","priority","title","content","good","improve","bad","identifier","_config","getResult","paper","researcher","_h1Count","getResearch","assessmentResult","calculatedResult","calculateResult","setScore","score","setStatus","status","htmlString","getText","desHasH1Tag","includes","console","log","getScore","isApplicable","hasText"],"sources":["../../../../src/scoring/assessments/seo/SingleH1Assessment.js"],"sourcesContent":["import {isUndefined, merge} from 'lodash';\nimport Assessment from '../assessment.js';\nimport AssessmentResult from '../../../values/AssessmentResult.js';\nimport {SINGLE_H1_ID} from '@axyseo/const/analysis';\n\n/**\n * Assessment to check whether the body of the text contains more than 1 H1s in the body.\n * This assessment doesn't penalize H1 that is not in the very beginning of the body.\n */\nclass SingleH1Assessment extends Assessment {\n /**\n * Sets the identifier and the config.\n *\n * @param {Object} config The configuration to use.\n *\n * @returns {void}\n */\n constructor(config = {}) {\n super();\n\n const defaultConfig = {\n id: SINGLE_H1_ID,\n docUrl: 'https://help.seoon.io/seo/seo-checklist',\n fixPosition: 'description',\n ctaType: 'contactUs',\n priority: 'high',\n title: 'H1 tag',\n content: {\n good: 'H1 tag is optimized.',\n improve: 'You should use only one H1 tag',\n bad: 'Missing H1 tag. Add one H1 to clearly define your page`s topic.'\n }\n };\n\n this.identifier = SINGLE_H1_ID;\n this._config = merge(defaultConfig, config);\n }\n\n /**\n * Runs the h1 research and based on this returns an assessment result with a score.\n *\n * @param {Paper} paper The paper to use for the assessment.\n * @param {Researcher} researcher The researcher used for calling the research.\n * @returns {AssessmentResult} The assessment result.\n */\n getResult({paper, researcher}) {\n this._h1Count = researcher.getResearch('h1s');\n const assessmentResult = new AssessmentResult({config: this._config});\n\n const calculatedResult = this.calculateResult(paper);\n\n if (!isUndefined(calculatedResult)) {\n assessmentResult.setScore(calculatedResult.score);\n assessmentResult.setStatus(calculatedResult.status);\n }\n\n return assessmentResult;\n }\n\n /**\n *\n * @param paper\n * @returns {{score: number, status: string}}\n */\n calculateResult(paper) {\n const htmlString = paper.getText();\n const desHasH1Tag = htmlString.includes('<h1>');\n console.log('calculateResult h1', htmlString, desHasH1Tag);\n\n let status = '';\n if (this._h1Count === 1) {\n status = 'good';\n }\n\n if (this._h1Count === 0 && !desHasH1Tag) {\n status = 'good';\n }\n\n if (this._h1Count > 1) {\n status = 'improve';\n }\n\n const score = this.getScore(this._config.priority, status);\n\n return {\n score,\n status\n };\n }\n\n /**\n * Checks whether the paper has a text.\n *\n * @param {Paper} paper The paper to use for the assessment.\n *\n * @returns {boolean} True when there is text.\n */\n isApplicable(paper) {\n return paper.hasText();\n }\n}\n\nexport default SingleH1Assessment;\n"],"mappings":"AAAA,SAAQA,WAAW,EAAEC,KAAK,QAAO,QAAQ;AACzC,OAAOC,UAAU;AACjB,OAAOC,gBAAgB;AACvB,SAAQC,YAAY;;AAEpB;AACA;AACA;AACA;AACA,MAAMC,kBAAkB,SAASH,UAAU,CAAC;EAC1C;AACF;AACA;AACA;AACA;AACA;AACA;EACEI,WAAWA,CAACC,MAAM,GAAG,CAAC,CAAC,EAAE;IACvB,KAAK,CAAC,CAAC;IAEP,MAAMC,aAAa,GAAG;MACpBC,EAAE,EAAEL,YAAY;MAChBM,MAAM,EAAE,yCAAyC;MACjDC,WAAW,EAAE,aAAa;MAC1BC,OAAO,EAAE,WAAW;MACpBC,QAAQ,EAAE,MAAM;MAChBC,KAAK,EAAE,QAAQ;MACfC,OAAO,EAAE;QACPC,IAAI,EAAE,sBAAsB;QAC5BC,OAAO,EAAE,gCAAgC;QACzCC,GAAG,EAAE;MACP;IACF,CAAC;IAED,IAAI,CAACC,UAAU,GAAGf,YAAY;IAC9B,IAAI,CAACgB,OAAO,GAAGnB,KAAK,CAACO,aAAa,EAAED,MAAM,CAAC;EAC7C;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACEc,SAASA,CAAC;IAACC,KAAK;IAAEC;EAAU,CAAC,EAAE;IAC7B,IAAI,CAACC,QAAQ,GAAGD,UAAU,CAACE,WAAW,CAAC,KAAK,CAAC;IAC7C,MAAMC,gBAAgB,GAAG,IAAIvB,gBAAgB,CAAC;MAACI,MAAM,EAAE,IAAI,CAACa;IAAO,CAAC,CAAC;IAErE,MAAMO,gBAAgB,GAAG,IAAI,CAACC,eAAe,CAACN,KAAK,CAAC;IAEpD,IAAI,CAACtB,WAAW,CAAC2B,gBAAgB,CAAC,EAAE;MAClCD,gBAAgB,CAACG,QAAQ,CAACF,gBAAgB,CAACG,KAAK,CAAC;MACjDJ,gBAAgB,CAACK,SAAS,CAACJ,gBAAgB,CAACK,MAAM,CAAC;IACrD;IAEA,OAAON,gBAAgB;EACzB;;EAEA;AACF;AACA;AACA;AACA;EACEE,eAAeA,CAACN,KAAK,EAAE;IACrB,MAAMW,UAAU,GAAGX,KAAK,CAACY,OAAO,CAAC,CAAC;IAClC,MAAMC,WAAW,GAAGF,UAAU,CAACG,QAAQ,CAAC,MAAM,CAAC;IAC/CC,OAAO,CAACC,GAAG,CAAC,oBAAoB,EAAEL,UAAU,EAAEE,WAAW,CAAC;IAE1D,IAAIH,MAAM,GAAG,EAAE;IACf,IAAI,IAAI,CAACR,QAAQ,KAAK,CAAC,EAAE;MACvBQ,MAAM,GAAG,MAAM;IACjB;IAEA,IAAI,IAAI,CAACR,QAAQ,KAAK,CAAC,IAAI,CAACW,WAAW,EAAE;MACvCH,MAAM,GAAG,MAAM;IACjB;IAEA,IAAI,IAAI,CAACR,QAAQ,GAAG,CAAC,EAAE;MACrBQ,MAAM,GAAG,SAAS;IACpB;IAEA,MAAMF,KAAK,GAAG,IAAI,CAACS,QAAQ,CAAC,IAAI,CAACnB,OAAO,CAACP,QAAQ,EAAEmB,MAAM,CAAC;IAE1D,OAAO;MACLF,KAAK;MACLE;IACF,CAAC;EACH;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACEQ,YAAYA,CAAClB,KAAK,EAAE;IAClB,OAAOA,KAAK,CAACmB,OAAO,CAAC,CAAC;EACxB;AACF;AAEA,eAAepC,kBAAkB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assessor.js","names":["filter","find","findIndex","isFunction","isUndefined","map","AssessmentResult","build","LanguageProcessor","MissingArgument","showTrace","ScoreRating","Assessor","constructor","researcher","config","type","setResearcher","_assessments","_researcher","getAvailableAssessments","isApplicable","assessment","paper","ignoreAssessments","getIgnoredAssessments","includes","_config","id","hasOwnProperty","hasMarker","marker","getMarks","getSpecificMarker","getPaper","_lastPaper","assess","i18n","setPaper","languageProcessor","shortcodes","_attributes","setTree","assessments","results","bind","executeAssessment","result","title","translate","content","good","improve","bad","skippedAssessments","getSkippedAssessments","assessmentResult","score","getScore","priority","factor","setScore","setStatus","setTitle","getResult","setIdentifier","assessmentError","setFactor","getValidResults","isValidResult","hasScore","hasText","calculateOverallScore","totalScore","reduce","total","Math","round","length","addAssessment","name","identifier","getAssessment","removeAssessment","push","toDelete","splice","getApplicableAssessments","availableAssessments","availableAssessment"],"sources":["../../../src/scoring/assessors/assessor.js"],"sourcesContent":["// External dependencies.\nimport {filter, find, findIndex, isFunction, isUndefined, map} from 'lodash';\n\n// Internal dependencies.\nimport AssessmentResult from '../../values/AssessmentResult.js';\nimport {build} from '../../parse/build';\nimport LanguageProcessor from '../../parse/language/LanguageProcessor.js';\nimport MissingArgument from '../../errors/missingArgument.js';\nimport {showTrace} from '../../helpers/errors.js';\n\n// The maximum score of individual assessment is 9. This is why we set the \"score rating\" here to 9.\nconst ScoreRating = 9;\n\n/**\n * The Assessor is a base class for all assessors.\n */\nclass Assessor {\n /**\n * Creates a new Assessor instance.\n * @param {Researcher}\tresearcher\tThe researcher to use.\n * @param {Object}\t\t[config]\tThe assessor config.\n */\n constructor(researcher, config) {\n this.type = 'assessor';\n this.setResearcher(researcher);\n this._assessments = [];\n }\n\n /**\n * Checks if the researcher is defined and sets it.\n *\n * @param {Researcher} researcher The researcher to use in the assessor.\n *\n * @throws {MissingArgument} Parameter needs to be a valid researcher object.\n * @returns {void}\n */\n setResearcher(researcher) {\n if (isUndefined(researcher)) {\n throw new MissingArgument('The assessor requires a researcher.');\n }\n this._researcher = researcher;\n }\n\n /**\n * Gets all available assessments.\n * @returns {Assessment[]} assessment\n */\n getAvailableAssessments() {\n return this._assessments;\n }\n\n /**\n * Checks whether the Assessment is applicable.\n *\n * @param {Assessment} assessment The Assessment object that needs to be checked.\n * @param {Paper} paper The Paper object to check against.\n * @param {Researcher} [researcher] The Researcher object containing additional information.\n * @returns {boolean} Whether or not the Assessment is applicable.\n */\n isApplicable(assessment, paper, researcher) {\n const ignoreAssessments = paper.getIgnoredAssessments();\n\n if (ignoreAssessments.includes(assessment._config.id)) {\n return false;\n }\n\n if (\n assessment.hasOwnProperty('isApplicable') ||\n typeof assessment.isApplicable === 'function'\n ) {\n return assessment.isApplicable(paper, researcher);\n }\n\n return true;\n }\n\n /**\n * Determines whether an assessment has a marker.\n *\n * @param {Assessment} assessment The assessment to check for.\n * @returns {boolean} Whether or not the assessment has a marker.\n */\n hasMarker(assessment) {\n return (\n isFunction(this._config.marker) &&\n (assessment.hasOwnProperty('getMarks') || typeof assessment.getMarks === 'function')\n );\n }\n\n /**\n * Returns the specific marker for this assessor.\n *\n * @returns {Function} The specific marker for this assessor.\n */\n getSpecificMarker() {\n return this._config.marker;\n }\n\n /**\n * Returns the paper that was most recently assessed.\n *\n * @returns {Paper} The paper that was most recently assessed.\n */\n getPaper() {\n return this._lastPaper;\n }\n\n /**\n * Runs the researches defined in the task list or the default researches.\n *\n * @param {Paper} paper The paper to run assessments on.\n * @param i18n\n * @returns {void}\n */\n assess(paper, i18n) {\n this._researcher.setPaper(paper);\n\n const languageProcessor = new LanguageProcessor(this._researcher);\n const shortcodes = paper._attributes && paper._attributes.shortcodes;\n paper.setTree(build(paper, languageProcessor, shortcodes));\n\n let assessments = this.getAvailableAssessments();\n this.results = [];\n\n assessments = filter(\n assessments,\n function(assessment) {\n return this.isApplicable(assessment, paper, this._researcher);\n }.bind(this)\n );\n\n this.results = map(assessments, assessment =>\n this.executeAssessment({\n paper,\n researcher: this._researcher,\n assessment,\n i18n\n })\n );\n this._lastPaper = paper;\n }\n\n /**\n * Executes an assessment and returns the AssessmentResult.\n *\n * @param {Paper} paper The paper to pass to the assessment.\n * @param {Researcher} researcher The researcher to pass to the assessment.\n * @param {Assessment} assessment The assessment to execute.\n * @param i18n\n * @returns {AssessmentResult} The result of the assessment.\n */\n executeAssessment({paper, researcher, assessment, i18n}) {\n let result;\n\n try {\n if (i18n) {\n assessment._config.title = i18n.translate(`Axyseo.${assessment._config.id}.title`);\n assessment._config.content = {\n good: i18n.translate(`Axyseo.${assessment._config.id}.good`),\n improve: i18n.translate(`Axyseo.${assessment._config.id}.improve`),\n bad: i18n.translate(`Axyseo.${assessment._config.id}.bad`)\n };\n }\n\n const skippedAssessments = paper.getSkippedAssessments();\n\n if (skippedAssessments.includes(assessment._config.id)) {\n const assessmentResult = new AssessmentResult({config: assessment._config});\n\n const score = assessment.getScore(\n assessment._config.priority,\n 'good',\n assessment._config.factor\n );\n\n assessmentResult.setScore(score);\n assessmentResult.setStatus('good');\n assessmentResult.setTitle(assessment._config.title);\n\n result = assessmentResult;\n } else {\n result = assessment.getResult({paper, researcher, i18n});\n }\n result.setIdentifier(assessment._config.id);\n } catch (assessmentError) {\n showTrace(assessmentError);\n\n result = new AssessmentResult();\n\n result.setScore(-1);\n }\n\n if (assessment?._config?.factor) {\n result.setFactor(assessment._config.factor);\n }\n\n return result;\n }\n\n /**\n * Filters out all assessment results that have no score and no text.\n *\n * @returns {AssessmentResult[]} The array with all the valid assessments.\n */\n getValidResults() {\n return filter(\n this.results,\n function(result) {\n return this.isValidResult(result);\n }.bind(this)\n );\n }\n\n /**\n * Returns if an assessmentResult is valid.\n *\n * @param {AssessmentResult} assessmentResult The assessmentResult to validate.\n * @returns {boolean} whether or not the result is valid.\n */\n isValidResult(assessmentResult) {\n return assessmentResult.hasScore() && assessmentResult.hasText();\n }\n\n /**\n * Returns the overall score. Calculates the total score by adding all scores and dividing these\n * by the number of results times the ScoreRating.\n *\n * @returns {number} The overall score.\n */\n calculateOverallScore() {\n const results = this.getValidResults();\n\n const totalScore = results.reduce(\n (total, assessmentResult) => total + assessmentResult.getScore(),\n 0\n );\n\n return Math.round((totalScore / (results.length * ScoreRating)) * 100) || 0;\n }\n\n /**\n * Registers an assessment and adds it to the internal assessments object.\n *\n * @param {string} name The name of the assessment.\n * @param {Assessment} assessment The object containing function to run as an assessment and it's requirements.\n * @returns {boolean} Whether registering the assessment was successful.\n */\n addAssessment(name, assessment) {\n if (!assessment.hasOwnProperty('identifier')) {\n assessment.identifier = name;\n }\n // If the assessor already has the same assessment, remove it and replace it with the new assessment with the same identifier.\n if (this.getAssessment(assessment.identifier)) {\n this.removeAssessment(assessment.identifier);\n }\n\n this._assessments.push(assessment);\n return true;\n }\n\n /**\n * Removes a specific Assessment from the list of Assessments.\n *\n * @param {string} name The Assessment to remove from the list of assessments.\n * @returns {void}\n */\n removeAssessment(name) {\n const toDelete = findIndex(this._assessments, function(assessment) {\n return assessment.hasOwnProperty('identifier') && name === assessment.identifier;\n });\n\n if (-1 !== toDelete) {\n this._assessments.splice(toDelete, 1);\n }\n }\n\n /**\n * Returns an assessment by identifier\n *\n * @param {string} identifier The identifier of the assessment.\n * @returns {undefined|Assessment} The object if found, otherwise undefined.\n */\n getAssessment(identifier) {\n return find(this._assessments, function(assessment) {\n return assessment.hasOwnProperty('identifier') && identifier === assessment.identifier;\n });\n }\n\n /**\n * Checks which of the available assessments are applicable and returns an array with applicable assessments.\n *\n * @returns {Assessment[]} The array with applicable assessments.\n */\n getApplicableAssessments() {\n const availableAssessments = this.getAvailableAssessments();\n return filter(\n availableAssessments,\n function(availableAssessment) {\n return this.isApplicable(availableAssessment, this.getPaper(), this._researcher);\n }.bind(this)\n );\n }\n}\n\nexport default Assessor;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"assessor.js","names":["filter","find","findIndex","isFunction","isUndefined","map","AssessmentResult","build","LanguageProcessor","MissingArgument","showTrace","ScoreRating","Assessor","constructor","researcher","config","type","setResearcher","_assessments","_researcher","getAvailableAssessments","isApplicable","assessment","paper","ignoreAssessments","getIgnoredAssessments","includes","_config","id","hasOwnProperty","hasMarker","marker","getMarks","getSpecificMarker","getPaper","_lastPaper","assess","i18n","setPaper","languageProcessor","shortcodes","_attributes","setTree","assessments","results","bind","executeAssessment","result","title","translate","content","good","improve","bad","skippedAssessments","getSkippedAssessments","assessmentResult","score","getScore","priority","factor","setScore","setStatus","setTitle","getResult","setIdentifier","assessmentError","setFactor","getValidResults","isValidResult","hasScore","hasText","calculateOverallScore","totalScore","reduce","total","Math","round","length","addAssessment","name","identifier","getAssessment","removeAssessment","push","toDelete","splice","getApplicableAssessments","availableAssessments","availableAssessment"],"sources":["../../../src/scoring/assessors/assessor.js"],"sourcesContent":["// External dependencies.\nimport {filter, find, findIndex, isFunction, isUndefined, map} from 'lodash';\n\n// Internal dependencies.\nimport AssessmentResult from '../../values/AssessmentResult.js';\nimport {build} from '../../parse/build';\nimport LanguageProcessor from '../../parse/language/LanguageProcessor.js';\nimport MissingArgument from '../../errors/missingArgument.js';\nimport {showTrace} from '../../helpers/errors.js';\n\n// The maximum score of individual assessment is 9. This is why we set the \"score rating\" here to 9.\nconst ScoreRating = 9;\n\n/**\n * The Assessor is a base class for all assessors.\n */\nclass Assessor {\n /**\n * Creates a new Assessor instance.\n * @param {Researcher}\tresearcher\tThe researcher to use.\n * @param {Object}\t\t[config]\tThe assessor config.\n */\n constructor(researcher, config) {\n this.type = 'assessor';\n this.setResearcher(researcher);\n this._assessments = [];\n }\n\n /**\n * Checks if the researcher is defined and sets it.\n *\n * @param {Researcher} researcher The researcher to use in the assessor.\n *\n * @throws {MissingArgument} Parameter needs to be a valid researcher object.\n * @returns {void}\n */\n setResearcher(researcher) {\n if (isUndefined(researcher)) {\n throw new MissingArgument('The assessor requires a researcher.');\n }\n this._researcher = researcher;\n }\n\n /**\n * Gets all available assessments.\n * @returns {Assessment[]} assessment\n */\n getAvailableAssessments() {\n return this._assessments;\n }\n\n /**\n * Checks whether the Assessment is applicable.\n *\n * @param {Assessment} assessment The Assessment object that needs to be checked.\n * @param {Paper} paper The Paper object to check against.\n * @param {Researcher} [researcher] The Researcher object containing additional information.\n * @returns {boolean} Whether or not the Assessment is applicable.\n */\n isApplicable(assessment, paper, researcher) {\n const ignoreAssessments = paper.getIgnoredAssessments();\n\n if (ignoreAssessments.includes(assessment._config.id)) {\n return false;\n }\n\n if (\n assessment.hasOwnProperty('isApplicable') ||\n typeof assessment.isApplicable === 'function'\n ) {\n return assessment.isApplicable(paper, researcher);\n }\n\n return true;\n }\n\n /**\n * Determines whether an assessment has a marker.\n *\n * @param {Assessment} assessment The assessment to check for.\n * @returns {boolean} Whether or not the assessment has a marker.\n */\n hasMarker(assessment) {\n return (\n isFunction(this._config.marker) &&\n (assessment.hasOwnProperty('getMarks') || typeof assessment.getMarks === 'function')\n );\n }\n\n /**\n * Returns the specific marker for this assessor.\n *\n * @returns {Function} The specific marker for this assessor.\n */\n getSpecificMarker() {\n return this._config.marker;\n }\n\n /**\n * Returns the paper that was most recently assessed.\n *\n * @returns {Paper} The paper that was most recently assessed.\n */\n getPaper() {\n return this._lastPaper;\n }\n\n /**\n * Runs the researches defined in the task list or the default researches.\n *\n * @param {Paper} paper The paper to run assessments on.\n * @param i18n\n * @returns {void}\n */\n assess(paper, i18n) {\n this._researcher.setPaper(paper);\n\n const languageProcessor = new LanguageProcessor(this._researcher);\n const shortcodes = paper._attributes && paper._attributes.shortcodes;\n paper.setTree(build(paper, languageProcessor, shortcodes));\n\n let assessments = this.getAvailableAssessments();\n\n this.results = [];\n\n assessments = filter(\n assessments,\n function(assessment) {\n return this.isApplicable(assessment, paper, this._researcher);\n }.bind(this)\n );\n\n this.results = map(assessments, assessment =>\n this.executeAssessment({\n paper,\n researcher: this._researcher,\n assessment,\n i18n\n })\n );\n this._lastPaper = paper;\n }\n\n /**\n * Executes an assessment and returns the AssessmentResult.\n *\n * @param {Paper} paper The paper to pass to the assessment.\n * @param {Researcher} researcher The researcher to pass to the assessment.\n * @param {Assessment} assessment The assessment to execute.\n * @param i18n\n * @returns {AssessmentResult} The result of the assessment.\n */\n executeAssessment({paper, researcher, assessment, i18n}) {\n let result;\n\n try {\n if (i18n) {\n assessment._config.title = i18n.translate(`Axyseo.${assessment._config.id}.title`);\n assessment._config.content = {\n good: i18n.translate(`Axyseo.${assessment._config.id}.good`),\n improve: i18n.translate(`Axyseo.${assessment._config.id}.improve`),\n bad: i18n.translate(`Axyseo.${assessment._config.id}.bad`)\n };\n }\n\n const skippedAssessments = paper.getSkippedAssessments();\n\n if (skippedAssessments.includes(assessment._config.id)) {\n const assessmentResult = new AssessmentResult({config: assessment._config});\n\n const score = assessment.getScore(\n assessment._config.priority,\n 'good',\n assessment._config.factor\n );\n\n assessmentResult.setScore(score);\n assessmentResult.setStatus('good');\n assessmentResult.setTitle(assessment._config.title);\n\n result = assessmentResult;\n } else {\n result = assessment.getResult({paper, researcher, i18n});\n }\n result.setIdentifier(assessment._config.id);\n } catch (assessmentError) {\n showTrace(assessmentError);\n\n result = new AssessmentResult();\n\n result.setScore(-1);\n }\n\n if (assessment?._config?.factor) {\n result.setFactor(assessment._config.factor);\n }\n\n return result;\n }\n\n /**\n * Filters out all assessment results that have no score and no text.\n *\n * @returns {AssessmentResult[]} The array with all the valid assessments.\n */\n getValidResults() {\n return filter(\n this.results,\n function(result) {\n return this.isValidResult(result);\n }.bind(this)\n );\n }\n\n /**\n * Returns if an assessmentResult is valid.\n *\n * @param {AssessmentResult} assessmentResult The assessmentResult to validate.\n * @returns {boolean} whether or not the result is valid.\n */\n isValidResult(assessmentResult) {\n return assessmentResult.hasScore() && assessmentResult.hasText();\n }\n\n /**\n * Returns the overall score. Calculates the total score by adding all scores and dividing these\n * by the number of results times the ScoreRating.\n *\n * @returns {number} The overall score.\n */\n calculateOverallScore() {\n const results = this.getValidResults();\n\n const totalScore = results.reduce(\n (total, assessmentResult) => total + assessmentResult.getScore(),\n 0\n );\n\n return Math.round((totalScore / (results.length * ScoreRating)) * 100) || 0;\n }\n\n /**\n * Registers an assessment and adds it to the internal assessments object.\n *\n * @param {string} name The name of the assessment.\n * @param {Assessment} assessment The object containing function to run as an assessment and it's requirements.\n * @returns {boolean} Whether registering the assessment was successful.\n */\n addAssessment(name, assessment) {\n if (!assessment.hasOwnProperty('identifier')) {\n assessment.identifier = name;\n }\n // If the assessor already has the same assessment, remove it and replace it with the new assessment with the same identifier.\n if (this.getAssessment(assessment.identifier)) {\n this.removeAssessment(assessment.identifier);\n }\n\n this._assessments.push(assessment);\n return true;\n }\n\n /**\n * Removes a specific Assessment from the list of Assessments.\n *\n * @param {string} name The Assessment to remove from the list of assessments.\n * @returns {void}\n */\n removeAssessment(name) {\n const toDelete = findIndex(this._assessments, function(assessment) {\n return assessment.hasOwnProperty('identifier') && name === assessment.identifier;\n });\n\n if (-1 !== toDelete) {\n this._assessments.splice(toDelete, 1);\n }\n }\n\n /**\n * Returns an assessment by identifier\n *\n * @param {string} identifier The identifier of the assessment.\n * @returns {undefined|Assessment} The object if found, otherwise undefined.\n */\n getAssessment(identifier) {\n return find(this._assessments, function(assessment) {\n return assessment.hasOwnProperty('identifier') && identifier === assessment.identifier;\n });\n }\n\n /**\n * Checks which of the available assessments are applicable and returns an array with applicable assessments.\n *\n * @returns {Assessment[]} The array with applicable assessments.\n */\n getApplicableAssessments() {\n const availableAssessments = this.getAvailableAssessments();\n return filter(\n availableAssessments,\n function(availableAssessment) {\n return this.isApplicable(availableAssessment, this.getPaper(), this._researcher);\n }.bind(this)\n );\n }\n}\n\nexport default Assessor;\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","status","score","data","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
|
|
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","status","score","data","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 let assessments = [...this.seoAssessor.results, ...this.contentAssessor.results];\n assessments = assessments.map(assessment => ({\n ...assessment.config,\n status: assessment.status,\n score: assessment.score,\n data: assessment.data,\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;IACxC,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,MAAM,EAAED,UAAU,CAACC,MAAM;MACzBC,KAAK,EAAEF,UAAU,CAACE,KAAK;MACvBC,IAAI,EAAEH,UAAU,CAACG,IAAI;MACrBC,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;QAACL,KAAK,EAAE,IAAI,CAACK,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,CAACE,KAAK;IAC3B,CAAC,CAAC;IAEF,MAAMQ,QAAQ,GAAGzB,WAAW,CAAC,IAAI,CAACY,WAAW,CAAC;IAC9C,OAAOc,IAAI,CAACC,KAAK,CAAEJ,KAAK,GAAG,GAAG,GAAIE,QAAQ,CAAC;EAC7C;AACF","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "axyseo",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.12",
|
|
4
4
|
"main": "build/index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"prepublishOnly": "npm run build ",
|
|
7
7
|
"build": "yarn clean && yarn build:js && yarn build:types",
|
|
8
|
-
"
|
|
8
|
+
"dev": "nodemon",
|
|
9
9
|
"build:js": "babel src --copy-files --source-maps --out-dir build",
|
|
10
10
|
"build:types": "tsc",
|
|
11
11
|
"clean": "rm -rf build",
|