axyseo 2.1.37 → 2.1.39
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/cjs/const/analysis.js +34 -1
- package/build/cjs/const/analysis.js.map +1 -1
- package/build/cjs/languageProcessing/helpers/url/url.js +5 -6
- package/build/cjs/languageProcessing/helpers/url/url.js.map +1 -1
- package/build/cjs/languageProcessing/languages/ja/helpers/countCharacters.js +1 -5
- package/build/cjs/languageProcessing/languages/ja/helpers/countCharacters.js.map +1 -1
- package/build/cjs/scoring/assessments/assessment.js +0 -1
- package/build/cjs/scoring/assessments/assessment.js.map +1 -1
- package/build/cjs/scoring/assessments/readability/SentenceLengthInTextAssessment.js +1 -1
- package/build/cjs/scoring/assessments/readability/SentenceLengthInTextAssessment.js.map +1 -1
- package/build/cjs/scoring/assessors/assessor.js +1 -1
- package/build/cjs/scoring/assessors/assessor.js.map +1 -1
- package/build/cjs/scoring/assessors/avadaAssessor.js +1 -2
- package/build/cjs/scoring/assessors/avadaAssessor.js.map +1 -1
- package/build/cjs/scoring/assessors/contentAssessor.js +1 -1
- package/build/cjs/scoring/assessors/contentAssessor.js.map +1 -1
- package/build/cjs/scoring/assessors/seoAssessor.js +1 -1
- package/build/cjs/scoring/assessors/seoAssessor.js.map +1 -1
- package/build/esm/const/analysis.js +33 -0
- package/build/esm/const/analysis.js.map +1 -1
- package/build/esm/languageProcessing/helpers/url/url.js +5 -6
- package/build/esm/languageProcessing/helpers/url/url.js.map +1 -1
- package/build/esm/languageProcessing/languages/ja/helpers/countCharacters.js +1 -5
- package/build/esm/languageProcessing/languages/ja/helpers/countCharacters.js.map +1 -1
- package/build/esm/scoring/assessments/assessment.js +0 -1
- package/build/esm/scoring/assessments/assessment.js.map +1 -1
- package/build/esm/scoring/assessments/readability/SentenceLengthInTextAssessment.js +1 -1
- package/build/esm/scoring/assessments/readability/SentenceLengthInTextAssessment.js.map +1 -1
- package/build/esm/scoring/assessors/assessor.js +2 -2
- package/build/esm/scoring/assessors/assessor.js.map +1 -1
- package/build/esm/scoring/assessors/avadaAssessor.js +1 -2
- package/build/esm/scoring/assessors/avadaAssessor.js.map +1 -1
- package/build/esm/scoring/assessors/contentAssessor.js +1 -1
- package/build/esm/scoring/assessors/contentAssessor.js.map +1 -1
- package/build/esm/scoring/assessors/seoAssessor.js +1 -1
- package/build/esm/scoring/assessors/seoAssessor.js.map +1 -1
- package/package.json +1 -3
|
@@ -76,4 +76,37 @@ export const RELATED_KEYWORDS_ID = 'relatedKeywords';
|
|
|
76
76
|
export const RELATED_KEYWORDS_DENSITY_ID = 'relatedKeywordsDensity';
|
|
77
77
|
export const MEDIA_ID = 'media';
|
|
78
78
|
export const contentSEOCategory = [INTRODUCTION_KEYWORD_ID, FAQs_ASSESSMENT_ID, SENTENCE_BEGINNINGS_ID, TEXT_SENTENCE_LENGTH_ID, TEXT_LENGTH_ID, TITLE_KEYWORD_ID, KEYPHRASE_LENGTH_ID, TEXT_TRANSITION_WORDS_ID, KEYPHRASE_DENSITY_ID, SLUG_KEYWORD_ID, KEYPHRASE_ID, TEXT_PARAGRAPH_TOO_LONG_ID, SUBHEADINGS_KEYWORD_ID, IMAGES_ID, NUMBER_TITLE_ID, META_DESCRIPTION_KEYWORD_ID, KEYWORD_FAQs_ASSESSMENT_ID, RELATED_KEYWORDS_ID, RELATED_KEYWORDS_DENSITY_ID, MEDIA_ID, CHARACTERS_URL, FAQs_STRUCTURE_DATA_ID];
|
|
79
|
+
export const idPointsMap = {
|
|
80
|
+
// keyword (15pts / 2 items = 7.5)
|
|
81
|
+
[KEYPHRASE_ID]: KEYWORD_POINTS,
|
|
82
|
+
[RELATED_KEYWORDS_ID]: KEYWORD_POINTS,
|
|
83
|
+
// technicalSeo (20pts / 3 items ≈ 6.67)
|
|
84
|
+
[SINGLE_H1_ID]: TECHNICAL_SEO_POINTS,
|
|
85
|
+
[SINGLE_TITLE_ID]: TECHNICAL_SEO_POINTS,
|
|
86
|
+
[SCHEMA_ID]: TECHNICAL_SEO_POINTS,
|
|
87
|
+
// mainContent (25pts / 7 items ≈ 3.57)
|
|
88
|
+
[KEYPHRASE_DENSITY_ID]: MAIN_CONTENT_POINTS,
|
|
89
|
+
[TEXT_PARAGRAPH_TOO_LONG_ID]: MAIN_CONTENT_POINTS,
|
|
90
|
+
[RELATED_KEYWORDS_DENSITY_ID]: MAIN_CONTENT_POINTS,
|
|
91
|
+
[TEXT_SENTENCE_LENGTH_ID]: MAIN_CONTENT_POINTS,
|
|
92
|
+
[INTRODUCTION_KEYWORD_ID]: MAIN_CONTENT_POINTS,
|
|
93
|
+
[SUBHEADINGS_KEYWORD_ID]: MAIN_CONTENT_POINTS,
|
|
94
|
+
[TEXT_LENGTH_ID]: MAIN_CONTENT_POINTS,
|
|
95
|
+
// metaTags (15pts / 4 items = 3.75)
|
|
96
|
+
[TITLE_WIDTH_ID]: META_TAG_POINTS,
|
|
97
|
+
[META_DESCRIPTION_LENGTH_ID]: META_TAG_POINTS,
|
|
98
|
+
[META_DESCRIPTION_KEYWORD_ID]: META_TAG_POINTS,
|
|
99
|
+
[TITLE_KEYWORD_ID]: META_TAG_POINTS,
|
|
100
|
+
// linkRecommend (10pts / 2 items = 5)
|
|
101
|
+
[INTERNAL_LINKS_ID]: LINK_RECOMMEND_POINTS,
|
|
102
|
+
[EXTERNAL_LINKS_ID]: LINK_RECOMMEND_POINTS,
|
|
103
|
+
// faqs (10pts / 3 items ≈ 3.33)
|
|
104
|
+
[FAQs_ASSESSMENT_ID]: FAQS_POINTS,
|
|
105
|
+
[KEYWORD_FAQs_ASSESSMENT_ID]: FAQS_POINTS,
|
|
106
|
+
[FAQs_STRUCTURE_DATA_ID]: FAQS_POINTS,
|
|
107
|
+
// urls (5pts / 3 items ≈ 1.67)
|
|
108
|
+
[URL_LENGTH_ID]: URLS_POINTS,
|
|
109
|
+
[SLUG_KEYWORD_ID]: URLS_POINTS,
|
|
110
|
+
[CHARACTERS_URL]: URLS_POINTS
|
|
111
|
+
};
|
|
79
112
|
//# sourceMappingURL=analysis.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis.js","names":["POINT","keywordRate","rate","items","technicalSeoRate","mainContentRate","metaTagRate","linkRecommendRate","faqsRate","urlsRate","priorityRate","high","medium","low","statusRate","good","bad","KEYWORD_POINTS","TECHNICAL_SEO_POINTS","MAIN_CONTENT_POINTS","META_TAG_POINTS","LINK_RECOMMEND_POINTS","FAQS_POINTS","URLS_POINTS","SINGLE_H1_ID","META_DESCRIPTION_LENGTH_ID","URL_LENGTH_ID","INTERNAL_LINKS_ID","EXTERNAL_LINKS_ID","TITLE_WIDTH_ID","TEXT_IMAGES_ID","SCHEMA_ID","SINGLE_TITLE_ID","technicalSEOCategory","INTRODUCTION_KEYWORD_ID","SENTENCE_BEGINNINGS_ID","TEXT_SENTENCE_LENGTH_ID","TEXT_LENGTH_ID","FAQs_ASSESSMENT_ID","FAQs_STRUCTURE_DATA_ID","KEYWORD_FAQs_ASSESSMENT_ID","TITLE_KEYWORD_ID","KEYPHRASE_LENGTH_ID","TEXT_TRANSITION_WORDS_ID","KEYPHRASE_DENSITY_ID","SLUG_KEYWORD_ID","CHARACTERS_URL","KEYPHRASE_ID","TEXT_PARAGRAPH_TOO_LONG_ID","SUBHEADINGS_KEYWORD_ID","IMAGES_ID","NUMBER_TITLE_ID","META_DESCRIPTION_KEYWORD_ID","RELATED_KEYWORDS_ID","RELATED_KEYWORDS_DENSITY_ID","MEDIA_ID","contentSEOCategory"],"sources":["../../../src/const/analysis.js"],"sourcesContent":["export const POINT = 100;\nexport const keywordRate = {\n rate: 15,\n items: 2\n}\nexport const technicalSeoRate = {\n rate: 20,\n items: 3\n}\nexport const mainContentRate = {\n rate: 25,\n items: 7\n}\nexport const metaTagRate = {\n rate: 15,\n items: 4\n}\nexport const linkRecommendRate = {\n rate: 10,\n items: 2\n}\nexport const faqsRate = {\n rate: 10,\n items: 3\n}\nexport const urlsRate = {\n rate: 5,\n items: 3\n}\n\nexport const priorityRate = {\n high: 1,\n medium: 0.75,\n low: 0.5\n};\nexport const statusRate = {\n good: 1,\n bad: 0\n};\nexport const KEYWORD_POINTS = (keywordRate.rate / keywordRate.items);\nexport const TECHNICAL_SEO_POINTS = (technicalSeoRate.rate / technicalSeoRate.items);\nexport const MAIN_CONTENT_POINTS = (mainContentRate.rate / mainContentRate.items);\nexport const META_TAG_POINTS = (metaTagRate.rate / metaTagRate.items);\nexport const LINK_RECOMMEND_POINTS = (linkRecommendRate.rate / linkRecommendRate.items);\nexport const FAQS_POINTS = (faqsRate .rate / faqsRate .items);\nexport const URLS_POINTS = (urlsRate.rate / urlsRate.items);\n\n\n\nexport const SINGLE_H1_ID = 'singleH1';\nexport const META_DESCRIPTION_LENGTH_ID = 'metaDescriptionLength';\nexport const URL_LENGTH_ID = 'urlLength';\nexport const INTERNAL_LINKS_ID = 'internalLinks';\nexport const EXTERNAL_LINKS_ID = 'externalLinks';\nexport const TITLE_WIDTH_ID = 'titleWidth';\nexport const TEXT_IMAGES_ID = 'textImages';\nexport const SCHEMA_ID = 'schema';\nexport const SINGLE_TITLE_ID = 'singleTitle';\n\nexport const technicalSEOCategory = [\n SINGLE_H1_ID,\n META_DESCRIPTION_LENGTH_ID,\n URL_LENGTH_ID,\n INTERNAL_LINKS_ID,\n EXTERNAL_LINKS_ID,\n TITLE_WIDTH_ID,\n TEXT_IMAGES_ID,\n SCHEMA_ID,\n SINGLE_TITLE_ID\n];\n\nexport const INTRODUCTION_KEYWORD_ID = 'introductionKeyword';\nexport const SENTENCE_BEGINNINGS_ID = 'sentenceBeginnings';\nexport const TEXT_SENTENCE_LENGTH_ID = 'textSentenceLength';\nexport const TEXT_LENGTH_ID = 'textLength';\nexport const FAQs_ASSESSMENT_ID = 'faqs';\nexport const FAQs_STRUCTURE_DATA_ID = 'faqsStructuredData';\nexport const KEYWORD_FAQs_ASSESSMENT_ID = 'keywordFaqs';\nexport const TITLE_KEYWORD_ID = 'titleKeyword';\nexport const KEYPHRASE_LENGTH_ID = 'keyphraseLength';\nexport const TEXT_TRANSITION_WORDS_ID = 'textTransitionWords';\nexport const KEYPHRASE_DENSITY_ID = 'keyphraseDensity';\nexport const SLUG_KEYWORD_ID = 'slugKeyword';\nexport const CHARACTERS_URL = 'charactersUrl';\nexport const KEYPHRASE_ID = 'keyphrase';\nexport const TEXT_PARAGRAPH_TOO_LONG_ID = 'textParagraphTooLong';\nexport const SUBHEADINGS_KEYWORD_ID = 'subheadingsKeyword';\nexport const IMAGES_ID = 'images';\nexport const NUMBER_TITLE_ID = 'numberTitle';\nexport const META_DESCRIPTION_KEYWORD_ID = 'metaDescriptionKeyword';\nexport const RELATED_KEYWORDS_ID = 'relatedKeywords';\nexport const RELATED_KEYWORDS_DENSITY_ID = 'relatedKeywordsDensity';\nexport const MEDIA_ID = 'media';\n\nexport const contentSEOCategory = [\n INTRODUCTION_KEYWORD_ID,\n FAQs_ASSESSMENT_ID,\n SENTENCE_BEGINNINGS_ID,\n TEXT_SENTENCE_LENGTH_ID,\n TEXT_LENGTH_ID,\n TITLE_KEYWORD_ID,\n KEYPHRASE_LENGTH_ID,\n TEXT_TRANSITION_WORDS_ID,\n KEYPHRASE_DENSITY_ID,\n SLUG_KEYWORD_ID,\n KEYPHRASE_ID,\n TEXT_PARAGRAPH_TOO_LONG_ID,\n SUBHEADINGS_KEYWORD_ID,\n IMAGES_ID,\n NUMBER_TITLE_ID,\n META_DESCRIPTION_KEYWORD_ID,\n KEYWORD_FAQs_ASSESSMENT_ID,\n RELATED_KEYWORDS_ID,\n RELATED_KEYWORDS_DENSITY_ID,\n MEDIA_ID,\n CHARACTERS_URL,\n FAQs_STRUCTURE_DATA_ID,\n];\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"analysis.js","names":["POINT","keywordRate","rate","items","technicalSeoRate","mainContentRate","metaTagRate","linkRecommendRate","faqsRate","urlsRate","priorityRate","high","medium","low","statusRate","good","bad","KEYWORD_POINTS","TECHNICAL_SEO_POINTS","MAIN_CONTENT_POINTS","META_TAG_POINTS","LINK_RECOMMEND_POINTS","FAQS_POINTS","URLS_POINTS","SINGLE_H1_ID","META_DESCRIPTION_LENGTH_ID","URL_LENGTH_ID","INTERNAL_LINKS_ID","EXTERNAL_LINKS_ID","TITLE_WIDTH_ID","TEXT_IMAGES_ID","SCHEMA_ID","SINGLE_TITLE_ID","technicalSEOCategory","INTRODUCTION_KEYWORD_ID","SENTENCE_BEGINNINGS_ID","TEXT_SENTENCE_LENGTH_ID","TEXT_LENGTH_ID","FAQs_ASSESSMENT_ID","FAQs_STRUCTURE_DATA_ID","KEYWORD_FAQs_ASSESSMENT_ID","TITLE_KEYWORD_ID","KEYPHRASE_LENGTH_ID","TEXT_TRANSITION_WORDS_ID","KEYPHRASE_DENSITY_ID","SLUG_KEYWORD_ID","CHARACTERS_URL","KEYPHRASE_ID","TEXT_PARAGRAPH_TOO_LONG_ID","SUBHEADINGS_KEYWORD_ID","IMAGES_ID","NUMBER_TITLE_ID","META_DESCRIPTION_KEYWORD_ID","RELATED_KEYWORDS_ID","RELATED_KEYWORDS_DENSITY_ID","MEDIA_ID","contentSEOCategory","idPointsMap"],"sources":["../../../src/const/analysis.js"],"sourcesContent":["export const POINT = 100;\nexport const keywordRate = {\n rate: 15,\n items: 2\n}\nexport const technicalSeoRate = {\n rate: 20,\n items: 3\n}\nexport const mainContentRate = {\n rate: 25,\n items: 7\n}\nexport const metaTagRate = {\n rate: 15,\n items: 4\n}\nexport const linkRecommendRate = {\n rate: 10,\n items: 2\n}\nexport const faqsRate = {\n rate: 10,\n items: 3\n}\nexport const urlsRate = {\n rate: 5,\n items: 3\n}\n\nexport const priorityRate = {\n high: 1,\n medium: 0.75,\n low: 0.5\n};\nexport const statusRate = {\n good: 1,\n bad: 0\n};\nexport const KEYWORD_POINTS = (keywordRate.rate / keywordRate.items);\nexport const TECHNICAL_SEO_POINTS = (technicalSeoRate.rate / technicalSeoRate.items);\nexport const MAIN_CONTENT_POINTS = (mainContentRate.rate / mainContentRate.items);\nexport const META_TAG_POINTS = (metaTagRate.rate / metaTagRate.items);\nexport const LINK_RECOMMEND_POINTS = (linkRecommendRate.rate / linkRecommendRate.items);\nexport const FAQS_POINTS = (faqsRate .rate / faqsRate .items);\nexport const URLS_POINTS = (urlsRate.rate / urlsRate.items);\n\n\n\nexport const SINGLE_H1_ID = 'singleH1';\nexport const META_DESCRIPTION_LENGTH_ID = 'metaDescriptionLength';\nexport const URL_LENGTH_ID = 'urlLength';\nexport const INTERNAL_LINKS_ID = 'internalLinks';\nexport const EXTERNAL_LINKS_ID = 'externalLinks';\nexport const TITLE_WIDTH_ID = 'titleWidth';\nexport const TEXT_IMAGES_ID = 'textImages';\nexport const SCHEMA_ID = 'schema';\nexport const SINGLE_TITLE_ID = 'singleTitle';\n\nexport const technicalSEOCategory = [\n SINGLE_H1_ID,\n META_DESCRIPTION_LENGTH_ID,\n URL_LENGTH_ID,\n INTERNAL_LINKS_ID,\n EXTERNAL_LINKS_ID,\n TITLE_WIDTH_ID,\n TEXT_IMAGES_ID,\n SCHEMA_ID,\n SINGLE_TITLE_ID\n];\n\nexport const INTRODUCTION_KEYWORD_ID = 'introductionKeyword';\nexport const SENTENCE_BEGINNINGS_ID = 'sentenceBeginnings';\nexport const TEXT_SENTENCE_LENGTH_ID = 'textSentenceLength';\nexport const TEXT_LENGTH_ID = 'textLength';\nexport const FAQs_ASSESSMENT_ID = 'faqs';\nexport const FAQs_STRUCTURE_DATA_ID = 'faqsStructuredData';\nexport const KEYWORD_FAQs_ASSESSMENT_ID = 'keywordFaqs';\nexport const TITLE_KEYWORD_ID = 'titleKeyword';\nexport const KEYPHRASE_LENGTH_ID = 'keyphraseLength';\nexport const TEXT_TRANSITION_WORDS_ID = 'textTransitionWords';\nexport const KEYPHRASE_DENSITY_ID = 'keyphraseDensity';\nexport const SLUG_KEYWORD_ID = 'slugKeyword';\nexport const CHARACTERS_URL = 'charactersUrl';\nexport const KEYPHRASE_ID = 'keyphrase';\nexport const TEXT_PARAGRAPH_TOO_LONG_ID = 'textParagraphTooLong';\nexport const SUBHEADINGS_KEYWORD_ID = 'subheadingsKeyword';\nexport const IMAGES_ID = 'images';\nexport const NUMBER_TITLE_ID = 'numberTitle';\nexport const META_DESCRIPTION_KEYWORD_ID = 'metaDescriptionKeyword';\nexport const RELATED_KEYWORDS_ID = 'relatedKeywords';\nexport const RELATED_KEYWORDS_DENSITY_ID = 'relatedKeywordsDensity';\nexport const MEDIA_ID = 'media';\n\nexport const contentSEOCategory = [\n INTRODUCTION_KEYWORD_ID,\n FAQs_ASSESSMENT_ID,\n SENTENCE_BEGINNINGS_ID,\n TEXT_SENTENCE_LENGTH_ID,\n TEXT_LENGTH_ID,\n TITLE_KEYWORD_ID,\n KEYPHRASE_LENGTH_ID,\n TEXT_TRANSITION_WORDS_ID,\n KEYPHRASE_DENSITY_ID,\n SLUG_KEYWORD_ID,\n KEYPHRASE_ID,\n TEXT_PARAGRAPH_TOO_LONG_ID,\n SUBHEADINGS_KEYWORD_ID,\n IMAGES_ID,\n NUMBER_TITLE_ID,\n META_DESCRIPTION_KEYWORD_ID,\n KEYWORD_FAQs_ASSESSMENT_ID,\n RELATED_KEYWORDS_ID,\n RELATED_KEYWORDS_DENSITY_ID,\n MEDIA_ID,\n CHARACTERS_URL,\n FAQs_STRUCTURE_DATA_ID,\n];\n\n\nexport const idPointsMap = {\n // keyword (15pts / 2 items = 7.5)\n [KEYPHRASE_ID]: KEYWORD_POINTS,\n [RELATED_KEYWORDS_ID]: KEYWORD_POINTS,\n // technicalSeo (20pts / 3 items ≈ 6.67)\n [SINGLE_H1_ID]: TECHNICAL_SEO_POINTS,\n [SINGLE_TITLE_ID]: TECHNICAL_SEO_POINTS,\n [SCHEMA_ID]: TECHNICAL_SEO_POINTS,\n // mainContent (25pts / 7 items ≈ 3.57)\n [KEYPHRASE_DENSITY_ID]: MAIN_CONTENT_POINTS,\n [TEXT_PARAGRAPH_TOO_LONG_ID]: MAIN_CONTENT_POINTS,\n [RELATED_KEYWORDS_DENSITY_ID]: MAIN_CONTENT_POINTS,\n [TEXT_SENTENCE_LENGTH_ID]: MAIN_CONTENT_POINTS,\n [INTRODUCTION_KEYWORD_ID]: MAIN_CONTENT_POINTS,\n [SUBHEADINGS_KEYWORD_ID]: MAIN_CONTENT_POINTS,\n [TEXT_LENGTH_ID]: MAIN_CONTENT_POINTS,\n // metaTags (15pts / 4 items = 3.75)\n [TITLE_WIDTH_ID]: META_TAG_POINTS,\n [META_DESCRIPTION_LENGTH_ID]: META_TAG_POINTS,\n [META_DESCRIPTION_KEYWORD_ID]: META_TAG_POINTS,\n [TITLE_KEYWORD_ID]: META_TAG_POINTS,\n // linkRecommend (10pts / 2 items = 5)\n [INTERNAL_LINKS_ID]: LINK_RECOMMEND_POINTS,\n [EXTERNAL_LINKS_ID]: LINK_RECOMMEND_POINTS,\n // faqs (10pts / 3 items ≈ 3.33)\n [FAQs_ASSESSMENT_ID]: FAQS_POINTS,\n [KEYWORD_FAQs_ASSESSMENT_ID]: FAQS_POINTS,\n [FAQs_STRUCTURE_DATA_ID]: FAQS_POINTS,\n // urls (5pts / 3 items ≈ 1.67)\n [URL_LENGTH_ID]: URLS_POINTS,\n [SLUG_KEYWORD_ID]: URLS_POINTS,\n [CHARACTERS_URL]: URLS_POINTS,\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -116,16 +116,15 @@ function isInternalLink(anchorUrl, siteUrlOrDomain) {
|
|
|
116
116
|
if (!anchorUrlHostName) {
|
|
117
117
|
return true;
|
|
118
118
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
119
|
+
const stripWww = hostname => hostname ? hostname.replace(/^www\./, "") : hostname;
|
|
120
|
+
const normalizedAnchorHostName = stripWww(anchorUrlHostName);
|
|
121
|
+
const normalizedSiteUrlOrDomain = stripWww(siteUrlOrDomain);
|
|
122
|
+
if (normalizedAnchorHostName === normalizedSiteUrlOrDomain) {
|
|
122
123
|
return true;
|
|
123
124
|
}
|
|
124
|
-
|
|
125
|
-
// If the siteUrlOrDomain variable is a URL and it shares the hostname with the anchor URL, it's an internal link.
|
|
126
125
|
const parsedSiteUrlOrDomain = urlMethods.parse(siteUrlOrDomain);
|
|
127
126
|
const siteUrlOrDomainHostName = parsedSiteUrlOrDomain.hostname;
|
|
128
|
-
return
|
|
127
|
+
return normalizedAnchorHostName === stripWww(siteUrlOrDomainHostName);
|
|
129
128
|
}
|
|
130
129
|
|
|
131
130
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","names":["urlFromAnchorRegex","urlMethods","removeHash","url","split","removeQueryArgs","removeTrailingSlash","replace","addTrailingSlash","getFromAnchorTag","anchorTag","urlMatch","exec","areEqual","urlA","urlB","getHostname","parse","hostname","getProtocol","protocol","isInternalLink","anchorUrl","siteUrlOrDomain","parsedAnchorUrl","anchorUrlHostName","indexOf","parsedSiteUrlOrDomain","siteUrlOrDomainHostName","protocolIsHttpScheme","isRelativeFragmentURL"],"sources":["../../../../../src/languageProcessing/helpers/url/url.js"],"sourcesContent":["const urlFromAnchorRegex = /href=([\"'])([^\"']+)\\1/i;\nimport urlMethods from \"url\";\n\n/**\n * Removes a hash from a URL, assumes a well formed URL.\n *\n * @param {string} url The URL to remove a hash from.\n * @returns {string} The URL without the hash.\n */\nfunction removeHash( url ) {\n\treturn url.split( \"#\" )[ 0 ];\n}\n\n/**\n * Removes all query args from a URL, assumes a well formed URL.\n *\n * @param {string} url The URL to remove the query args from.\n * @returns {string} The URL without the query args.\n */\nfunction removeQueryArgs( url ) {\n\treturn url.split( \"?\" )[ 0 ];\n}\n\n/**\n * Removes the trailing slash of a URL.\n *\n * @param {string} url The URL to remove the trailing slash from.\n * @returns {string} A URL without a trailing slash.\n */\nfunction removeTrailingSlash( url ) {\n\treturn url.replace( /\\/$/, \"\" );\n}\n\n/**\n * Adds a trailing slash to a URL if it is not present.\n *\n * @param {string} url The URL to add a trailing slash to.\n * @returns {string} A URL with a trailing slash.\n */\nfunction addTrailingSlash( url ) {\n\treturn removeTrailingSlash( url ) + \"/\";\n}\n\n/**\n * Retrieves the URL from an anchor tag.\n *\n * @param {string} anchorTag An anchor tag.\n * @returns {string} The URL in the anchor tag.\n */\nfunction getFromAnchorTag( anchorTag ) {\n\tconst urlMatch = urlFromAnchorRegex.exec( anchorTag );\n\n\treturn ( urlMatch === null ) ? \"\" : urlMatch[ 2 ];\n}\n\n/**\n * Returns whether or not the given URLs are equal.\n *\n * @param {string} urlA The first URL to compare.\n * @param {string} urlB The second URL to compare.\n *\n * @returns {boolean} Whether or not the given URLs are equal.\n */\nfunction areEqual( urlA, urlB ) {\n\t// Make sure we are comparing URLs without query arguments and hashes.\n\turlA = removeQueryArgs( removeHash( urlA ) );\n\turlB = removeQueryArgs( removeHash( urlB ) );\n\n\treturn addTrailingSlash( urlA ) === addTrailingSlash( urlB );\n}\n\n/**\n * Returns the domain name of a URL.\n *\n * @param {string} url The URL to retrieve the domain name of.\n * @returns {string} The domain name of the URL.\n */\nfunction getHostname( url ) {\n\turl = urlMethods.parse( url );\n\n\treturn url.hostname;\n}\n\n/**\n * Returns the protocol of a URL.\n *\n * Note that the colon (http:) is also part of the protocol, conform to node's url.parse api.\n *\n * @param {string} url The URL to retrieve the protocol of.\n * @returns {string|null} The protocol of the URL or null if no protocol is present.\n */\nfunction getProtocol( url ) {\n\treturn urlMethods.parse( url ).protocol;\n}\n\n/**\n * Determine whether an anchor URL is internal.\n *\n * @param {string} anchorUrl \t\tThe anchor URL to test.\n * @param {string} siteUrlOrDomain The current site's URL or domain.\n *\n * @returns {boolean} Whether or not the anchor URL is internal.\n */\nfunction isInternalLink( anchorUrl, siteUrlOrDomain ) {\n
|
|
1
|
+
{"version":3,"file":"url.js","names":["urlFromAnchorRegex","urlMethods","removeHash","url","split","removeQueryArgs","removeTrailingSlash","replace","addTrailingSlash","getFromAnchorTag","anchorTag","urlMatch","exec","areEqual","urlA","urlB","getHostname","parse","hostname","getProtocol","protocol","isInternalLink","anchorUrl","siteUrlOrDomain","parsedAnchorUrl","anchorUrlHostName","indexOf","stripWww","normalizedAnchorHostName","normalizedSiteUrlOrDomain","parsedSiteUrlOrDomain","siteUrlOrDomainHostName","protocolIsHttpScheme","isRelativeFragmentURL"],"sources":["../../../../../src/languageProcessing/helpers/url/url.js"],"sourcesContent":["const urlFromAnchorRegex = /href=([\"'])([^\"']+)\\1/i;\nimport urlMethods from \"url\";\n\n/**\n * Removes a hash from a URL, assumes a well formed URL.\n *\n * @param {string} url The URL to remove a hash from.\n * @returns {string} The URL without the hash.\n */\nfunction removeHash( url ) {\n\treturn url.split( \"#\" )[ 0 ];\n}\n\n/**\n * Removes all query args from a URL, assumes a well formed URL.\n *\n * @param {string} url The URL to remove the query args from.\n * @returns {string} The URL without the query args.\n */\nfunction removeQueryArgs( url ) {\n\treturn url.split( \"?\" )[ 0 ];\n}\n\n/**\n * Removes the trailing slash of a URL.\n *\n * @param {string} url The URL to remove the trailing slash from.\n * @returns {string} A URL without a trailing slash.\n */\nfunction removeTrailingSlash( url ) {\n\treturn url.replace( /\\/$/, \"\" );\n}\n\n/**\n * Adds a trailing slash to a URL if it is not present.\n *\n * @param {string} url The URL to add a trailing slash to.\n * @returns {string} A URL with a trailing slash.\n */\nfunction addTrailingSlash( url ) {\n\treturn removeTrailingSlash( url ) + \"/\";\n}\n\n/**\n * Retrieves the URL from an anchor tag.\n *\n * @param {string} anchorTag An anchor tag.\n * @returns {string} The URL in the anchor tag.\n */\nfunction getFromAnchorTag( anchorTag ) {\n\tconst urlMatch = urlFromAnchorRegex.exec( anchorTag );\n\n\treturn ( urlMatch === null ) ? \"\" : urlMatch[ 2 ];\n}\n\n/**\n * Returns whether or not the given URLs are equal.\n *\n * @param {string} urlA The first URL to compare.\n * @param {string} urlB The second URL to compare.\n *\n * @returns {boolean} Whether or not the given URLs are equal.\n */\nfunction areEqual( urlA, urlB ) {\n\t// Make sure we are comparing URLs without query arguments and hashes.\n\turlA = removeQueryArgs( removeHash( urlA ) );\n\turlB = removeQueryArgs( removeHash( urlB ) );\n\n\treturn addTrailingSlash( urlA ) === addTrailingSlash( urlB );\n}\n\n/**\n * Returns the domain name of a URL.\n *\n * @param {string} url The URL to retrieve the domain name of.\n * @returns {string} The domain name of the URL.\n */\nfunction getHostname( url ) {\n\turl = urlMethods.parse( url );\n\n\treturn url.hostname;\n}\n\n/**\n * Returns the protocol of a URL.\n *\n * Note that the colon (http:) is also part of the protocol, conform to node's url.parse api.\n *\n * @param {string} url The URL to retrieve the protocol of.\n * @returns {string|null} The protocol of the URL or null if no protocol is present.\n */\nfunction getProtocol( url ) {\n\treturn urlMethods.parse( url ).protocol;\n}\n\n/**\n * Determine whether an anchor URL is internal.\n *\n * @param {string} anchorUrl \t\tThe anchor URL to test.\n * @param {string} siteUrlOrDomain The current site's URL or domain.\n *\n * @returns {boolean} Whether or not the anchor URL is internal.\n */\nfunction isInternalLink( anchorUrl, siteUrlOrDomain ) {\n const parsedAnchorUrl = urlMethods.parse( anchorUrl, false, true );\n const anchorUrlHostName = parsedAnchorUrl.hostname;\n\n // Check if the anchor URL starts with a single slash.\n if ( anchorUrl.indexOf( \"//\" ) === -1 && anchorUrl.indexOf( \"/\" ) === 0 ) {\n return true;\n }\n\n // Check if the anchor URL starts with a # indicating a fragment.\n if ( anchorUrl.indexOf( \"#\" ) === 0 ) {\n return false;\n }\n\n // No host of the anchor URL indicates an internal link.\n if ( ! anchorUrlHostName ) {\n return true;\n }\n\n const stripWww = ( hostname ) => hostname ? hostname.replace( /^www\\./, \"\" ) : hostname;\n const normalizedAnchorHostName = stripWww( anchorUrlHostName );\n const normalizedSiteUrlOrDomain = stripWww( siteUrlOrDomain );\n\n if ( normalizedAnchorHostName === normalizedSiteUrlOrDomain ) {\n return true;\n }\n\n const parsedSiteUrlOrDomain = urlMethods.parse( siteUrlOrDomain );\n const siteUrlOrDomainHostName = parsedSiteUrlOrDomain.hostname;\n return normalizedAnchorHostName === stripWww( siteUrlOrDomainHostName );\n}\n\n/**\n * Checks whether the protocol is either HTTP: or HTTPS:.\n *\n * @param {string} protocol The protocol to test.\n *\n * @returns {boolean} Whether the protocol is http(s):.\n */\nfunction protocolIsHttpScheme( protocol ) {\n\tif ( ! protocol ) {\n\t\treturn false;\n\t}\n\n\treturn ( protocol === \"http:\" || protocol === \"https:\" );\n}\n\n/**\n * Determines whether the link is a relative fragment URL.\n *\n * @param {string} url The URL to test.\n *\n * @returns {boolean} Whether the link is a relative fragment URL.\n */\nfunction isRelativeFragmentURL( url ) {\n\treturn url.indexOf( \"#\" ) === 0;\n}\n\nexport default {\n\tremoveHash: removeHash,\n\tremoveQueryArgs: removeQueryArgs,\n\tremoveTrailingSlash: removeTrailingSlash,\n\taddTrailingSlash: addTrailingSlash,\n\tgetFromAnchorTag: getFromAnchorTag,\n\tareEqual: areEqual,\n\tgetHostname: getHostname,\n\tgetProtocol: getProtocol,\n\tisInternalLink: isInternalLink,\n\tprotocolIsHttpScheme: protocolIsHttpScheme,\n\tisRelativeFragmentURL: isRelativeFragmentURL,\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import { languageProcessing } from "../../../../index.js";
|
|
2
|
-
const {
|
|
3
|
-
sanitizeString
|
|
4
|
-
} = languageProcessing;
|
|
5
1
|
import removeURLs from "../../../helpers/sanitize/removeURLs.js";
|
|
6
2
|
|
|
7
3
|
/**
|
|
@@ -14,7 +10,7 @@ import removeURLs from "../../../helpers/sanitize/removeURLs.js";
|
|
|
14
10
|
*/
|
|
15
11
|
export default function (text) {
|
|
16
12
|
text = removeURLs(text);
|
|
17
|
-
text = sanitizeString(text);
|
|
13
|
+
// text = sanitizeString(text);
|
|
18
14
|
text = text.replace(/\s/g, '');
|
|
19
15
|
return text.length;
|
|
20
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"countCharacters.js","names":["
|
|
1
|
+
{"version":3,"file":"countCharacters.js","names":["removeURLs","text","replace","length"],"sources":["../../../../../../src/languageProcessing/languages/ja/helpers/countCharacters.js"],"sourcesContent":["\nimport removeURLs from '../../../helpers/sanitize/removeURLs.js';\n\n/**\n * Calculates the character count which serves as a measure of text length.\n * The character count includes letters, punctuation, and numbers. It doesn't include URLs, HTML tags, and spaces.\n *\n * @param {string} text The text to be counted.\n *\n * @returns {number} The character count of the given text.\n */\nexport default function(text) {\n text = removeURLs(text);\n // text = sanitizeString(text);\n text = text.replace(/\\s/g, '');\n\n return text.length;\n}\n"],"mappings":"AACA,OAAOA,UAAU;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAASC,IAAI,EAAE;EAC5BA,IAAI,GAAGD,UAAU,CAACC,IAAI,CAAC;EACvB;EACAA,IAAI,GAAGA,IAAI,CAACC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;EAE9B,OAAOD,IAAI,CAACE,MAAM;AACpB","ignoreList":[]}
|
|
@@ -60,7 +60,6 @@ class Assessment {
|
|
|
60
60
|
* @returns {number}
|
|
61
61
|
*/
|
|
62
62
|
getScore(points, status = 'good') {
|
|
63
|
-
console.log(`Calculating score for with status ${status} and points ${points}`);
|
|
64
63
|
const newStatus = status === 'bad' ? 'bad' : 'good';
|
|
65
64
|
return points * statusRate[newStatus];
|
|
66
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assessment.js","names":["sanitizeString","filterShortcodesFromHTML","removeHtmlBlocks","statusRate","Assessment","getResult","paper","researcher","i18n","isApplicable","hasEnoughContentForAssessment","contentNeededForAssessment","text","getText","_attributes","shortcodes","length","checkCanSkip","getScore","points","status","
|
|
1
|
+
{"version":3,"file":"assessment.js","names":["sanitizeString","filterShortcodesFromHTML","removeHtmlBlocks","statusRate","Assessment","getResult","paper","researcher","i18n","isApplicable","hasEnoughContentForAssessment","contentNeededForAssessment","text","getText","_attributes","shortcodes","length","checkCanSkip","getScore","points","status","newStatus"],"sources":["../../../../src/scoring/assessments/assessment.js"],"sourcesContent":["/* eslint-disable no-unused-vars */\nimport {sanitizeString} from '../../languageProcessing';\nimport {filterShortcodesFromHTML, removeHtmlBlocks} from '../../languageProcessing/helpers';\nimport {statusRate} from '../../const/analysis';\n\n/**\n * The base class for an Assessment.\n */\nclass Assessment {\n /**\n * Executes the assessment and return its result.\n *\n * @param {Paper} paper The paper to run this assessment on.\n * @param {Researcher} researcher The researcher used for the assessment.\n * @param i18n\n * @returns {AssessmentResult} The result of the assessment.\n */\n getResult({paper, researcher, i18n}) {\n throw 'The method getResult is not implemented';\n }\n\n /**\n * Checks whether the assessment is applicable.\n *\n * @param {Paper} paper The paper to run this assessment on.\n * @param {Researcher} researcher The researcher used for the assessment.\n *\n * @returns {boolean} Whether the assessment is applicable, defaults to `true`.\n */\n isApplicable(paper, researcher) {\n return true;\n }\n\n /**\n * Tests whether a `Paper` has enough content for assessments to be displayed.\n *\n * @param {Paper} paper The paper to run this assessment on.\n * @param {number} contentNeededForAssessment The minimum length in characters a text must have for assessments to be displayed.\n *\n * @returns {boolean} `true` if the text is of the required length, `false` otherwise.\n */\n hasEnoughContentForAssessment(paper, contentNeededForAssessment = 50) {\n let text = paper.getText();\n text = removeHtmlBlocks(text);\n text = filterShortcodesFromHTML(text, paper._attributes && paper._attributes.shortcodes);\n\n return sanitizeString(text).length >= contentNeededForAssessment;\n }\n\n checkCanSkip(paper) {\n return !this.hasEnoughContentForAssessment;\n }\n\n /**\n *\n * @param points\n * @param status\n * @returns {number}\n */\n getScore(points, status = 'good') {\n const newStatus = status === 'bad' ? 'bad' : 'good';\n return points * statusRate[newStatus]\n\n }\n}\n\n/* eslint-enable no-unused-vars */\n\nexport default Assessment;\n"],"mappings":"AAAA;AACA,SAAQA,cAAc;AACtB,SAAQC,wBAAwB,EAAEC,gBAAgB;AAClD,SAAQC,UAAU;;AAElB;AACA;AACA;AACA,MAAMC,UAAU,CAAC;EACf;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,SAASA,CAAC;IAACC,KAAK;IAAEC,UAAU;IAAEC;EAAI,CAAC,EAAE;IACnC,MAAM,yCAAyC;EACjD;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,YAAYA,CAACH,KAAK,EAAEC,UAAU,EAAE;IAC9B,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEG,6BAA6BA,CAACJ,KAAK,EAAEK,0BAA0B,GAAG,EAAE,EAAE;IACpE,IAAIC,IAAI,GAAGN,KAAK,CAACO,OAAO,CAAC,CAAC;IAC1BD,IAAI,GAAGV,gBAAgB,CAACU,IAAI,CAAC;IAC7BA,IAAI,GAAGX,wBAAwB,CAACW,IAAI,EAAEN,KAAK,CAACQ,WAAW,IAAIR,KAAK,CAACQ,WAAW,CAACC,UAAU,CAAC;IAExF,OAAOf,cAAc,CAACY,IAAI,CAAC,CAACI,MAAM,IAAIL,0BAA0B;EAClE;EAEAM,YAAYA,CAACX,KAAK,EAAE;IAClB,OAAO,CAAC,IAAI,CAACI,6BAA6B;EAC5C;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEQ,QAAQA,CAACC,MAAM,EAAEC,MAAM,GAAG,MAAM,EAAE;IAChC,MAAMC,SAAS,GAAGD,MAAM,KAAK,KAAK,GAAG,KAAK,GAAG,MAAM;IACnD,OAAOD,MAAM,GAAGhB,UAAU,CAACkB,SAAS,CAAC;EAEvC;AACF;;AAEA;;AAEA,eAAejB,UAAU","ignoreList":[]}
|
|
@@ -114,7 +114,7 @@ class SentenceLengthInTextAssessment extends Assessment {
|
|
|
114
114
|
*/
|
|
115
115
|
calculateResult(percentage, hasDescription) {
|
|
116
116
|
let status = 'bad';
|
|
117
|
-
if (
|
|
117
|
+
if (hasDescription && percentage <= this._config.slightlyTooMany) {
|
|
118
118
|
status = 'good';
|
|
119
119
|
}
|
|
120
120
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SentenceLengthInTextAssessment.js","names":["merge","Assessment","getTooLongSentences","formatNumber","AssessmentResult","MAIN_CONTENT_POINTS","TEXT_SENTENCE_LENGTH_ID","SentenceLengthInTextAssessment","constructor","config","defaultConfig","id","priority","docUrl","ctaType","fixPosition","recommendedLength","slightlyTooMany","farTooMany","title","content","improve","bad","good","_config","identifier","getResult","paper","researcher","sentences","getResearch","hasDescription","getConfig","getLanguageSpecificConfig","percentage","calculatePercentage","result","calculateResult","assessmentResult","setScore","score","setStatus","status","isApplicable","currentConfig","languageSpecificConfig","hasOwnProperty","length","tooLongTotal","countTooLongSentences","parseInt","getScore"],"sources":["../../../../../src/scoring/assessments/readability/SentenceLengthInTextAssessment.js"],"sourcesContent":["import {merge} from 'lodash';\nimport Assessment from '../assessment';\nimport getTooLongSentences from '../../helpers/assessments/checkForTooLongSentences';\nimport formatNumber from '../../../helpers/formatNumber';\nimport AssessmentResult from '../../../values/AssessmentResult';\nimport {MAIN_CONTENT_POINTS, TEXT_SENTENCE_LENGTH_ID} from '@axyseo/const/analysis';\n\n/**\n * Represents the assessment that will calculate the length of sentences in the text.\n */\nclass SentenceLengthInTextAssessment extends Assessment {\n /**\n\t * Sets the identifier and the config.\n\t *\n\t * @param {object} config\t\t\tThe scoring configuration that should be used.\n\n\t * @returns {void}\n\t */\n constructor(config = {}) {\n super();\n\n const defaultConfig = {\n id: TEXT_SENTENCE_LENGTH_ID,\n priority: 'high',\n docUrl:\n 'https://docs.avada.io/seo-suite-help-center/seo-audit/on-page-seo/checklist#sentence-length',\n ctaType: 'fix',\n fixPosition: 'sentenceLength',\n recommendedLength: 20,\n slightlyTooMany: 25,\n farTooMany: 30,\n title: 'Text Sentence Length',\n content: {\n improve: '',\n bad:\n 'Sentence too long. Keep sentence length less than 20 words to improve readability and flow.',\n good: 'Sentence length is optimized for readability, less than 20 words.'\n }\n };\n\n this._config = merge(defaultConfig, config);\n this.identifier = TEXT_SENTENCE_LENGTH_ID;\n }\n\n /**\n * Scores the percentage of sentences including more than the recommended number of words.\n *\n * @param {Paper} paper The paper to use for the assessment.\n * @param {Researcher} researcher The researcher used for calling research.\n *\n * @returns {AssessmentResult} The Assessment result.\n */\n getResult({paper, researcher}) {\n const sentences = researcher.getResearch('countSentencesFromText');\n const hasDescription = paper.hasDescription();\n if (researcher.getConfig('sentenceLength')) {\n this._config = this.getLanguageSpecificConfig(researcher);\n }\n const percentage = this.calculatePercentage(sentences);\n\n const result = this.calculateResult(percentage, hasDescription);\n\n const assessmentResult = new AssessmentResult({config: this._config});\n\n assessmentResult.setScore(result.score);\n assessmentResult.setStatus(result.status);\n\n return assessmentResult;\n }\n\n /**\n * Checks whether the paper has 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 true;\n }\n\n /**\n * Check if there is language-specific config, and if so, overwrite the current config with it.\n *\n * @param {Researcher} researcher The researcher to use.\n *\n * @returns {Object} The config that should be used.\n */\n getLanguageSpecificConfig(researcher) {\n const currentConfig = this._config;\n const languageSpecificConfig = researcher.getConfig('sentenceLength');\n\n if (languageSpecificConfig.hasOwnProperty('recommendedLength')) {\n currentConfig.recommendedLength = languageSpecificConfig.recommendedLength;\n }\n\n return currentConfig;\n }\n\n /**\n * Calculates the percentage of sentences that are too long.\n *\n * @param {Array} sentences The sentences to calculate the percentage for.\n * @returns {number} The calculates percentage of too long sentences.\n */\n calculatePercentage(sentences) {\n let percentage = 0;\n\n if (sentences.length !== 0) {\n const tooLongTotal = this.countTooLongSentences(sentences);\n percentage = formatNumber((tooLongTotal / sentences.length) * 100);\n }\n\n return percentage;\n }\n\n /**\n *\n * @param percentage\n * @param hasDescription\n * @returns {{score: number, status: string}}\n */\n calculateResult(percentage, hasDescription) {\n let status = 'bad';\n if (
|
|
1
|
+
{"version":3,"file":"SentenceLengthInTextAssessment.js","names":["merge","Assessment","getTooLongSentences","formatNumber","AssessmentResult","MAIN_CONTENT_POINTS","TEXT_SENTENCE_LENGTH_ID","SentenceLengthInTextAssessment","constructor","config","defaultConfig","id","priority","docUrl","ctaType","fixPosition","recommendedLength","slightlyTooMany","farTooMany","title","content","improve","bad","good","_config","identifier","getResult","paper","researcher","sentences","getResearch","hasDescription","getConfig","getLanguageSpecificConfig","percentage","calculatePercentage","result","calculateResult","assessmentResult","setScore","score","setStatus","status","isApplicable","currentConfig","languageSpecificConfig","hasOwnProperty","length","tooLongTotal","countTooLongSentences","parseInt","getScore"],"sources":["../../../../../src/scoring/assessments/readability/SentenceLengthInTextAssessment.js"],"sourcesContent":["import {merge} from 'lodash';\nimport Assessment from '../assessment';\nimport getTooLongSentences from '../../helpers/assessments/checkForTooLongSentences';\nimport formatNumber from '../../../helpers/formatNumber';\nimport AssessmentResult from '../../../values/AssessmentResult';\nimport {MAIN_CONTENT_POINTS, TEXT_SENTENCE_LENGTH_ID} from '@axyseo/const/analysis';\n\n/**\n * Represents the assessment that will calculate the length of sentences in the text.\n */\nclass SentenceLengthInTextAssessment extends Assessment {\n /**\n\t * Sets the identifier and the config.\n\t *\n\t * @param {object} config\t\t\tThe scoring configuration that should be used.\n\n\t * @returns {void}\n\t */\n constructor(config = {}) {\n super();\n\n const defaultConfig = {\n id: TEXT_SENTENCE_LENGTH_ID,\n priority: 'high',\n docUrl:\n 'https://docs.avada.io/seo-suite-help-center/seo-audit/on-page-seo/checklist#sentence-length',\n ctaType: 'fix',\n fixPosition: 'sentenceLength',\n recommendedLength: 20,\n slightlyTooMany: 25,\n farTooMany: 30,\n title: 'Text Sentence Length',\n content: {\n improve: '',\n bad:\n 'Sentence too long. Keep sentence length less than 20 words to improve readability and flow.',\n good: 'Sentence length is optimized for readability, less than 20 words.'\n }\n };\n\n this._config = merge(defaultConfig, config);\n this.identifier = TEXT_SENTENCE_LENGTH_ID;\n }\n\n /**\n * Scores the percentage of sentences including more than the recommended number of words.\n *\n * @param {Paper} paper The paper to use for the assessment.\n * @param {Researcher} researcher The researcher used for calling research.\n *\n * @returns {AssessmentResult} The Assessment result.\n */\n getResult({paper, researcher}) {\n const sentences = researcher.getResearch('countSentencesFromText');\n const hasDescription = paper.hasDescription();\n if (researcher.getConfig('sentenceLength')) {\n this._config = this.getLanguageSpecificConfig(researcher);\n }\n const percentage = this.calculatePercentage(sentences);\n\n const result = this.calculateResult(percentage, hasDescription);\n\n const assessmentResult = new AssessmentResult({config: this._config});\n\n assessmentResult.setScore(result.score);\n assessmentResult.setStatus(result.status);\n\n return assessmentResult;\n }\n\n /**\n * Checks whether the paper has 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 true;\n }\n\n /**\n * Check if there is language-specific config, and if so, overwrite the current config with it.\n *\n * @param {Researcher} researcher The researcher to use.\n *\n * @returns {Object} The config that should be used.\n */\n getLanguageSpecificConfig(researcher) {\n const currentConfig = this._config;\n const languageSpecificConfig = researcher.getConfig('sentenceLength');\n\n if (languageSpecificConfig.hasOwnProperty('recommendedLength')) {\n currentConfig.recommendedLength = languageSpecificConfig.recommendedLength;\n }\n\n return currentConfig;\n }\n\n /**\n * Calculates the percentage of sentences that are too long.\n *\n * @param {Array} sentences The sentences to calculate the percentage for.\n * @returns {number} The calculates percentage of too long sentences.\n */\n calculatePercentage(sentences) {\n let percentage = 0;\n\n if (sentences.length !== 0) {\n const tooLongTotal = this.countTooLongSentences(sentences);\n percentage = formatNumber((tooLongTotal / sentences.length) * 100);\n }\n\n return percentage;\n }\n\n /**\n *\n * @param percentage\n * @param hasDescription\n * @returns {{score: number, status: string}}\n */\n calculateResult(percentage, hasDescription) {\n let status = 'bad';\n\n if (hasDescription && percentage <= this._config.slightlyTooMany) {\n status = 'good';\n }\n return {\n score: parseInt(this.getScore(MAIN_CONTENT_POINTS, status)) || 0,\n status\n };\n }\n\n /**\n * Gets the sentences that are qualified as being too long.\n *\n * @param {array} sentences The sentences to filter through.\n * @returns {array} Array with all the sentences considered to be too long.\n */\n getTooLongSentences(sentences) {\n return getTooLongSentences(sentences, this._config.recommendedLength);\n }\n\n /**\n * Get the total amount of sentences that are qualified as being too long.\n *\n * @param {Array} sentences The sentences to filter through.\n * @returns {Number} The amount of sentences that are considered too long.\n */\n countTooLongSentences(sentences) {\n return this.getTooLongSentences(sentences).length;\n }\n}\n\nexport default SentenceLengthInTextAssessment;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -7,7 +7,7 @@ import { build } from "../../parse/build";
|
|
|
7
7
|
import LanguageProcessor from "../../parse/language/LanguageProcessor.js";
|
|
8
8
|
import MissingArgument from "../../errors/missingArgument.js";
|
|
9
9
|
import { showTrace } from "../../helpers/errors.js";
|
|
10
|
-
import { KEYPHRASE_DENSITY_ID, SCHEMA_ID, TEXT_LENGTH_ID } from "../../const/analysis";
|
|
10
|
+
import { idPointsMap, KEYPHRASE_DENSITY_ID, SCHEMA_ID, TEXT_LENGTH_ID } from "../../const/analysis";
|
|
11
11
|
|
|
12
12
|
// The maximum score of individual assessment is 9. This is why we set the "score rating" here to 9.
|
|
13
13
|
const ScoreRating = 9;
|
|
@@ -145,7 +145,7 @@ class Assessor {
|
|
|
145
145
|
const assessmentResult = new AssessmentResult({
|
|
146
146
|
config: assessment._config
|
|
147
147
|
});
|
|
148
|
-
const score = assessment.
|
|
148
|
+
const score = idPointsMap[assessment._config.id];
|
|
149
149
|
assessmentResult.setScore(score);
|
|
150
150
|
assessmentResult.setStatus('good');
|
|
151
151
|
assessmentResult.setTitle(assessment._config.title);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assessor.js","names":["filter","find","findIndex","isFunction","isUndefined","map","AssessmentResult","build","LanguageProcessor","MissingArgument","showTrace","KEYPHRASE_DENSITY_ID","SCHEMA_ID","TEXT_LENGTH_ID","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","skippedAssessments","getSkippedAssessments","assessmentResult","score","getScore","priority","factor","setScore","setStatus","setTitle","title","getResult","roundedDensity","prefix","translate","content","good","bad","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';\nimport {KEYPHRASE_DENSITY_ID, SCHEMA_ID, TEXT_LENGTH_ID} from '@axyseo/const/analysis';\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\n\n const skippedAssessments = paper.getSkippedAssessments();\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 if (i18n) {\n const { id, type, roundedDensity } = assessment._config;\n const prefix = `Axyseo.${id}`;\n\n if (id === SCHEMA_ID) {\n assessment._config.title = `${i18n.translate(`${prefix}.${type}.title`)}`;\n } else if (id === KEYPHRASE_DENSITY_ID) {\n assessment._config.title = `${i18n.translate(`${prefix}.title`)} ${roundedDensity}%`;\n } else {\n assessment._config.title = i18n.translate(`${prefix}.title`);\n }\n\n if ((id === TEXT_LENGTH_ID || id === SCHEMA_ID) && type) {\n assessment._config.content = {\n good: i18n.translate(`${prefix}.${type}.good`),\n bad: i18n.translate(`${prefix}.${type}.bad`),\n };\n } else {\n assessment._config.content = {\n good: i18n.translate(`${prefix}.good`),\n bad: i18n.translate(`${prefix}.bad`),\n };\n }\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","idPointsMap","KEYPHRASE_DENSITY_ID","SCHEMA_ID","TEXT_LENGTH_ID","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","skippedAssessments","getSkippedAssessments","assessmentResult","score","setScore","setStatus","setTitle","title","getResult","roundedDensity","prefix","translate","content","good","bad","setIdentifier","assessmentError","factor","setFactor","getValidResults","isValidResult","hasScore","hasText","calculateOverallScore","totalScore","reduce","total","getScore","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';\nimport {idPointsMap, KEYPHRASE_DENSITY_ID, SCHEMA_ID, TEXT_LENGTH_ID} from '@axyseo/const/analysis';\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\n\n const skippedAssessments = paper.getSkippedAssessments();\n if (skippedAssessments.includes(assessment._config.id)) {\n const assessmentResult = new AssessmentResult({config: assessment._config});\n\n const score = idPointsMap[assessment._config.id]\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 if (i18n) {\n const { id, type, roundedDensity } = assessment._config;\n const prefix = `Axyseo.${id}`;\n\n if (id === SCHEMA_ID) {\n assessment._config.title = `${i18n.translate(`${prefix}.${type}.title`)}`;\n } else if (id === KEYPHRASE_DENSITY_ID) {\n assessment._config.title = `${i18n.translate(`${prefix}.title`)} ${roundedDensity}%`;\n } else {\n assessment._config.title = i18n.translate(`${prefix}.title`);\n }\n\n if ((id === TEXT_LENGTH_ID || id === SCHEMA_ID) && type) {\n assessment._config.content = {\n good: i18n.translate(`${prefix}.${type}.good`),\n bad: i18n.translate(`${prefix}.${type}.bad`),\n };\n } else {\n assessment._config.content = {\n good: i18n.translate(`${prefix}.good`),\n bad: i18n.translate(`${prefix}.bad`),\n };\n }\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":[]}
|
|
@@ -43,11 +43,10 @@ export default class AvadaAssessor {
|
|
|
43
43
|
this.researcher = researcher;
|
|
44
44
|
this.config = config;
|
|
45
45
|
}
|
|
46
|
-
assess(paper, i18n) {
|
|
46
|
+
assess(paper, i18n = null) {
|
|
47
47
|
this.seoAssessor.assess(paper, i18n);
|
|
48
48
|
this.contentAssessor.assess(paper, i18n);
|
|
49
49
|
let assessments = [...this.seoAssessor.results, ...this.contentAssessor.results];
|
|
50
|
-
console.log('assessments', assessments);
|
|
51
50
|
assessments = assessments.map(assessment => ({
|
|
52
51
|
...assessment.config,
|
|
53
52
|
status: assessment.status,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avadaAssessor.js","names":["ContentAssessor","SEOAssessor","groupAssessmentsByCategory","groupAssessmentsByStatus","AvadaAssessor","constructor","researcher","config","seoAssessor","contentAssessor","assess","paper","i18n","assessments","results","
|
|
1
|
+
{"version":3,"file":"avadaAssessor.js","names":["ContentAssessor","SEOAssessor","groupAssessmentsByCategory","groupAssessmentsByStatus","AvadaAssessor","constructor","researcher","config","seoAssessor","contentAssessor","assess","paper","i18n","assessments","results","map","assessment","status","score","data","title","assessBackEnd","getResult","groupBy","getScore","point","forEach","Math","round"],"sources":["../../../../src/scoring/assessors/avadaAssessor.js"],"sourcesContent":["import {ContentAssessor, SEOAssessor} from '@axyseo/scoring/assessors/index';\nimport {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 = null) {\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 assessBackEnd(paper) {\n this.seoAssessor.assess(paper);\n this.contentAssessor.assess(paper);\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 || 0;\n });\n return Math.round((point));\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,7 +16,7 @@ export default class ContentAssessor extends Assessor {
|
|
|
16
16
|
* @param {Researcher} researcher The researcher to use.
|
|
17
17
|
* @param {Object} [config] The assessor config.
|
|
18
18
|
*/
|
|
19
|
-
constructor(researcher, config) {
|
|
19
|
+
constructor(researcher, config = {}) {
|
|
20
20
|
super(researcher, config);
|
|
21
21
|
this.type = 'contentAssessor';
|
|
22
22
|
this._assessments = [new ParagraphTooLong(config?.textParagraphTooLong), new SentenceLengthInText(config?.textSentenceLength), new TransitionWords(config?.textTransitionWords), new SentenceBeginnings(config?.sentenceBeginnings), new RelatedKeywordsAssessment(config?.relatedKeywords)];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contentAssessor.js","names":["map","sum","Assessor","ParagraphTooLong","SentenceLengthInText","SentenceBeginnings","TransitionWords","RelatedKeywordsAssessment","scoreToRating","ContentAssessor","constructor","researcher","config","type","_assessments","textParagraphTooLong","textSentenceLength","textTransitionWords","sentenceBeginnings","relatedKeywords","calculatePenaltyPointsFullSupport","rating","calculatePenaltyPointsPartialSupport","_allAssessmentsSupported","numberOfAssessments","length","applicableAssessments","getApplicableAssessments","calculatePenaltyPoints","results","getValidResults","penaltyPoints","result","getScore","bind","_ratePenaltyPoints","totalPenaltyPoints","calculateOverallScore"],"sources":["../../../../src/scoring/assessors/contentAssessor.js"],"sourcesContent":["import {map, sum} from 'lodash';\nimport Assessor from './assessor.js';\nimport ParagraphTooLong from '../assessments/readability/ParagraphTooLongAssessment.js';\nimport SentenceLengthInText from '../assessments/readability/SentenceLengthInTextAssessment.js';\nimport SentenceBeginnings from '../assessments/readability/SentenceBeginningsAssessment.js';\nimport TransitionWords from '../assessments/readability/TransitionWordsAssessment.js';\nimport RelatedKeywordsAssessment from '../assessments/readability/RelatedKeywordsAssessment.js';\nimport scoreToRating from '../interpreters/scoreToRating.js';\n\n/**\n * The ContentAssessor class is used for the readability analysis.\n */\nexport default class ContentAssessor extends Assessor {\n /**\n * Creates a new ContentAssessor instance.\n * @param {Researcher}\tresearcher\tThe researcher to use.\n * @param {Object}\t\t[config]\tThe assessor config.\n */\n constructor(researcher, config) {\n super(researcher, config);\n this.type = 'contentAssessor';\n\n this._assessments = [\n new ParagraphTooLong(config?.textParagraphTooLong),\n new SentenceLengthInText(config?.textSentenceLength),\n new TransitionWords(config?.textTransitionWords),\n new SentenceBeginnings(config?.sentenceBeginnings),\n new RelatedKeywordsAssessment(config?.relatedKeywords)\n ];\n }\n\n /**\n * Calculates the weighted rating for languages that have all assessments based on a given rating.\n *\n * @param {string} rating The rating to be weighted.\n * @returns {number} The weighted rating.\n */\n calculatePenaltyPointsFullSupport(rating) {\n switch (rating) {\n case 'bad':\n return 3;\n case 'ok':\n return 2;\n default:\n case 'good':\n return 0;\n }\n }\n\n /**\n * Calculates the weighted rating for languages that don't have all assessments based on a given rating.\n *\n * @param {string} rating The rating to be weighted.\n * @returns {number} The weighted rating.\n */\n calculatePenaltyPointsPartialSupport(rating) {\n switch (rating) {\n case 'bad':\n return 4;\n case 'ok':\n return 2;\n default:\n case 'good':\n return 0;\n }\n }\n\n /**\n * Determines whether a language is fully supported. If a language supports 7 content assessments,\n * it is fully supported\n *\n * @returns {boolean} True if fully supported.\n */\n _allAssessmentsSupported() {\n const numberOfAssessments = this._assessments.length;\n const applicableAssessments = this.getApplicableAssessments();\n return applicableAssessments.length === numberOfAssessments;\n }\n\n /**\n * Calculates the penalty points based on the assessment results.\n *\n * @returns {number} The total penalty points for the results.\n */\n calculatePenaltyPoints() {\n const results = this.getValidResults();\n\n const penaltyPoints = map(\n results,\n function(result) {\n const rating = scoreToRating(result.getScore());\n\n if (this._allAssessmentsSupported()) {\n return this.calculatePenaltyPointsFullSupport(rating);\n }\n\n return this.calculatePenaltyPointsPartialSupport(rating);\n }.bind(this)\n );\n\n return sum(penaltyPoints);\n }\n\n /**\n * Rates the penalty points\n *\n * @param {number} totalPenaltyPoints The amount of penalty points.\n * @returns {number} The score based on the amount of penalty points.\n *\n * @private\n */\n _ratePenaltyPoints(totalPenaltyPoints) {\n if (this.getValidResults().length === 1) {\n // If we have only 1 result, we only have a \"no content\" result\n return 30;\n }\n\n if (this._allAssessmentsSupported()) {\n // Determine the total score based on the total penalty points.\n if (totalPenaltyPoints > 6) {\n // A red indicator.\n return 30;\n }\n\n if (totalPenaltyPoints > 4) {\n // An orange indicator.\n return 60;\n }\n } else {\n if (totalPenaltyPoints > 4) {\n // A red indicator.\n return 30;\n }\n\n if (totalPenaltyPoints > 2) {\n // An orange indicator.\n return 60;\n }\n }\n // A green indicator.\n return 90;\n }\n\n /**\n * Calculates the overall score based on the assessment results.\n *\n * @returns {number} The overall score.\n */\n calculateOverallScore() {\n const results = this.getValidResults();\n\n // If you have no content, you have a red indicator.\n if (results.length === 0) {\n return 30;\n }\n\n const totalPenaltyPoints = this.calculatePenaltyPoints();\n\n return this._ratePenaltyPoints(totalPenaltyPoints);\n }\n}\n"],"mappings":"AAAA,SAAQA,GAAG,EAAEC,GAAG,QAAO,QAAQ;AAC/B,OAAOC,QAAQ;AACf,OAAOC,gBAAgB;AACvB,OAAOC,oBAAoB;AAC3B,OAAOC,kBAAkB;AACzB,OAAOC,eAAe;AACtB,OAAOC,yBAAyB;AAChC,OAAOC,aAAa;;AAEpB;AACA;AACA;AACA,eAAe,MAAMC,eAAe,SAASP,QAAQ,CAAC;EACpD;AACF;AACA;AACA;AACA;EACEQ,WAAWA,CAACC,UAAU,EAAEC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"contentAssessor.js","names":["map","sum","Assessor","ParagraphTooLong","SentenceLengthInText","SentenceBeginnings","TransitionWords","RelatedKeywordsAssessment","scoreToRating","ContentAssessor","constructor","researcher","config","type","_assessments","textParagraphTooLong","textSentenceLength","textTransitionWords","sentenceBeginnings","relatedKeywords","calculatePenaltyPointsFullSupport","rating","calculatePenaltyPointsPartialSupport","_allAssessmentsSupported","numberOfAssessments","length","applicableAssessments","getApplicableAssessments","calculatePenaltyPoints","results","getValidResults","penaltyPoints","result","getScore","bind","_ratePenaltyPoints","totalPenaltyPoints","calculateOverallScore"],"sources":["../../../../src/scoring/assessors/contentAssessor.js"],"sourcesContent":["import {map, sum} from 'lodash';\nimport Assessor from './assessor.js';\nimport ParagraphTooLong from '../assessments/readability/ParagraphTooLongAssessment.js';\nimport SentenceLengthInText from '../assessments/readability/SentenceLengthInTextAssessment.js';\nimport SentenceBeginnings from '../assessments/readability/SentenceBeginningsAssessment.js';\nimport TransitionWords from '../assessments/readability/TransitionWordsAssessment.js';\nimport RelatedKeywordsAssessment from '../assessments/readability/RelatedKeywordsAssessment.js';\nimport scoreToRating from '../interpreters/scoreToRating.js';\n\n/**\n * The ContentAssessor class is used for the readability analysis.\n */\nexport default class ContentAssessor extends Assessor {\n /**\n * Creates a new ContentAssessor instance.\n * @param {Researcher}\tresearcher\tThe researcher to use.\n * @param {Object}\t\t[config]\tThe assessor config.\n */\n constructor(researcher, config = {}) {\n super(researcher, config);\n this.type = 'contentAssessor';\n\n this._assessments = [\n new ParagraphTooLong(config?.textParagraphTooLong),\n new SentenceLengthInText(config?.textSentenceLength),\n new TransitionWords(config?.textTransitionWords),\n new SentenceBeginnings(config?.sentenceBeginnings),\n new RelatedKeywordsAssessment(config?.relatedKeywords)\n ];\n }\n\n /**\n * Calculates the weighted rating for languages that have all assessments based on a given rating.\n *\n * @param {string} rating The rating to be weighted.\n * @returns {number} The weighted rating.\n */\n calculatePenaltyPointsFullSupport(rating) {\n switch (rating) {\n case 'bad':\n return 3;\n case 'ok':\n return 2;\n default:\n case 'good':\n return 0;\n }\n }\n\n /**\n * Calculates the weighted rating for languages that don't have all assessments based on a given rating.\n *\n * @param {string} rating The rating to be weighted.\n * @returns {number} The weighted rating.\n */\n calculatePenaltyPointsPartialSupport(rating) {\n switch (rating) {\n case 'bad':\n return 4;\n case 'ok':\n return 2;\n default:\n case 'good':\n return 0;\n }\n }\n\n /**\n * Determines whether a language is fully supported. If a language supports 7 content assessments,\n * it is fully supported\n *\n * @returns {boolean} True if fully supported.\n */\n _allAssessmentsSupported() {\n const numberOfAssessments = this._assessments.length;\n const applicableAssessments = this.getApplicableAssessments();\n return applicableAssessments.length === numberOfAssessments;\n }\n\n /**\n * Calculates the penalty points based on the assessment results.\n *\n * @returns {number} The total penalty points for the results.\n */\n calculatePenaltyPoints() {\n const results = this.getValidResults();\n\n const penaltyPoints = map(\n results,\n function(result) {\n const rating = scoreToRating(result.getScore());\n\n if (this._allAssessmentsSupported()) {\n return this.calculatePenaltyPointsFullSupport(rating);\n }\n\n return this.calculatePenaltyPointsPartialSupport(rating);\n }.bind(this)\n );\n\n return sum(penaltyPoints);\n }\n\n /**\n * Rates the penalty points\n *\n * @param {number} totalPenaltyPoints The amount of penalty points.\n * @returns {number} The score based on the amount of penalty points.\n *\n * @private\n */\n _ratePenaltyPoints(totalPenaltyPoints) {\n if (this.getValidResults().length === 1) {\n // If we have only 1 result, we only have a \"no content\" result\n return 30;\n }\n\n if (this._allAssessmentsSupported()) {\n // Determine the total score based on the total penalty points.\n if (totalPenaltyPoints > 6) {\n // A red indicator.\n return 30;\n }\n\n if (totalPenaltyPoints > 4) {\n // An orange indicator.\n return 60;\n }\n } else {\n if (totalPenaltyPoints > 4) {\n // A red indicator.\n return 30;\n }\n\n if (totalPenaltyPoints > 2) {\n // An orange indicator.\n return 60;\n }\n }\n // A green indicator.\n return 90;\n }\n\n /**\n * Calculates the overall score based on the assessment results.\n *\n * @returns {number} The overall score.\n */\n calculateOverallScore() {\n const results = this.getValidResults();\n\n // If you have no content, you have a red indicator.\n if (results.length === 0) {\n return 30;\n }\n\n const totalPenaltyPoints = this.calculatePenaltyPoints();\n\n return this._ratePenaltyPoints(totalPenaltyPoints);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -33,7 +33,7 @@ export default class SEOAssessor extends Assessor {
|
|
|
33
33
|
* @param {Researcher} researcher The researcher to use.
|
|
34
34
|
* @param {Object} [config] The assessor config.
|
|
35
35
|
*/
|
|
36
|
-
constructor(researcher, config) {
|
|
36
|
+
constructor(researcher, config = {}) {
|
|
37
37
|
super(researcher, config);
|
|
38
38
|
this.type = 'SEOAssessor';
|
|
39
39
|
this._assessments = [new MetaTitleKeywordAssessment(config?.titleKeyword), new TextImagesAssessment(config?.textImages), new NumberInMetaTitleAssessment(config?.numberTitle), new IntroductionKeywordAssessment(config?.introductionKeyword), new MetaDescriptionKeywordAssessment(config?.metaDescriptionKeyword), new MetaDescriptionLength(config?.metaDescriptionLength), new SubheadingsKeyword(config?.subheadingsKeyword), new OutboundLinks(config?.externalLinks), new KeyphraseDensityAssessment(config?.keyphraseDensity), new ImageCount(config?.media), new UrlLengthAssessment(config?.urlLength), new SingleTitleAssessment(config?.singleTitle), new KeyphraseAssessment(config?.keyphrase), new InternalLinksAssessment(config?.internalLinks), new TitleWidth(config?.titleWidth), new SlugKeywordAssessment(config?.slugKeyword), new SingleH1Assessment(config?.singleH1), new SchemaAssessment(config?.schema), new FAQsAssessment(config?.faqs), new KeywordFAQsAssessment(config?.keywordFaqs), new FAQsStructureDataAssessment(config?.faqsStructuredData), new InvalidCharactersInUrl(config?.charactersUrl), new RelatedKeywordsDensityAssessment(config?.relatedKeywordsDensity), new TextLengthAssessment(config?.textLength)];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seoAssessor.js","names":["Assessor","IntroductionKeywordAssessment","MetaDescriptionKeywordAssessment","MetaDescriptionLength","SubheadingsKeyword","OutboundLinks","KeyphraseDensityAssessment","InternalLinksAssessment","SlugKeywordAssessment","ImageCount","TitleWidth","SingleH1Assessment","KeyphraseAssessment","SingleTitleAssessment","UrlLengthAssessment","NumberInMetaTitleAssessment","TextImagesAssessment","TextLengthAssessment","MetaTitleKeywordAssessment","SchemaAssessment","FAQsAssessment","KeywordFAQsAssessment","InvalidCharactersInUrl","FAQsStructureDataAssessment","RelatedKeywordsDensityAssessment","SEOAssessor","constructor","researcher","config","type","_assessments","titleKeyword","textImages","numberTitle","introductionKeyword","metaDescriptionKeyword","metaDescriptionLength","subheadingsKeyword","externalLinks","keyphraseDensity","media","urlLength","singleTitle","keyphrase","internalLinks","titleWidth","slugKeyword","singleH1","schema","faqs","keywordFaqs","faqsStructuredData","charactersUrl","relatedKeywordsDensity","textLength"],"sources":["../../../../src/scoring/assessors/seoAssessor.js"],"sourcesContent":["import Assessor from './assessor';\nimport IntroductionKeywordAssessment from '../assessments/seo/IntroductionKeywordAssessment';\nimport MetaDescriptionKeywordAssessment from '../assessments/seo/MetaDescriptionKeywordAssessment';\nimport MetaDescriptionLength from '../assessments/seo/MetaDescriptionLengthAssessment';\nimport SubheadingsKeyword from '../assessments/seo/SubHeadingsKeywordAssessment';\nimport OutboundLinks from '../assessments/seo/OutboundLinksAssessment';\nimport KeyphraseDensityAssessment from '../assessments/seo/KeywordDensityAssessment';\nimport InternalLinksAssessment from '../assessments/seo/InternalLinksAssessment';\nimport SlugKeywordAssessment from '../assessments/seo/UrlKeywordAssessment';\nimport ImageCount from '../assessments/seo/ImageCountAssessment';\nimport TitleWidth from '../assessments/seo/PageTitleWidthAssessment';\nimport SingleH1Assessment from '../assessments/seo/SingleH1Assessment';\nimport KeyphraseAssessment from '../assessments/seo/KeyphraseAssessment';\nimport SingleTitleAssessment from '../assessments/seo/SingleTitleAssessment';\nimport UrlLengthAssessment from '../assessments/seo/UrlLengthAssessment';\nimport NumberInMetaTitleAssessment from '../assessments/seo/NumberInMetaTitleAssessment';\nimport TextImagesAssessment from '../assessments/seo/TextImagesAssessment';\nimport TextLengthAssessment from '../assessments/seo/TextLengthAssessment';\nimport MetaTitleKeywordAssessment from '../assessments/seo/MetaTitleKeywordAssessment';\nimport SchemaAssessment from '@axyseo/scoring/assessments/seo/SchemaAssessment';\nimport FAQsAssessment from '../assessments/seo/FAQsAssessment';\nimport KeywordFAQsAssessment from '../assessments/seo/KeywordFAQsAssessment';\nimport InvalidCharactersInUrl from '../assessments/seo/InvalidCharactersInUrl';\nimport FAQsStructureDataAssessment from '@axyseo/scoring/assessments/seo/FAQsStructureDataAssessment';\nimport RelatedKeywordsDensityAssessment from '@axyseo/scoring/assessments/seo/RelatedKeywordsDensityAssessment';\n\n/**\n * The SEOAssessor class is used for the general SEO analysis.\n */\nexport default class SEOAssessor extends Assessor {\n /**\n * Creates a new SEOAssessor instance.\n * @param {Researcher}\tresearcher\tThe researcher to use.\n * @param {Object}\t\t[config]\tThe assessor config.\n */\n constructor(researcher, config) {\n super(researcher, config);\n this.type = 'SEOAssessor';\n\n this._assessments = [\n new MetaTitleKeywordAssessment(config?.titleKeyword),\n new TextImagesAssessment(config?.textImages),\n new NumberInMetaTitleAssessment(config?.numberTitle),\n new IntroductionKeywordAssessment(config?.introductionKeyword),\n new MetaDescriptionKeywordAssessment(config?.metaDescriptionKeyword),\n new MetaDescriptionLength(config?.metaDescriptionLength),\n new SubheadingsKeyword(config?.subheadingsKeyword),\n new OutboundLinks(config?.externalLinks),\n new KeyphraseDensityAssessment(config?.keyphraseDensity),\n new ImageCount(config?.media),\n new UrlLengthAssessment(config?.urlLength),\n new SingleTitleAssessment(config?.singleTitle),\n new KeyphraseAssessment(config?.keyphrase),\n new InternalLinksAssessment(config?.internalLinks),\n new TitleWidth(config?.titleWidth),\n new SlugKeywordAssessment(config?.slugKeyword),\n new SingleH1Assessment(config?.singleH1),\n new SchemaAssessment(config?.schema),\n new FAQsAssessment(config?.faqs),\n new KeywordFAQsAssessment(config?.keywordFaqs),\n new FAQsStructureDataAssessment(config?.faqsStructuredData),\n new InvalidCharactersInUrl(config?.charactersUrl),\n new RelatedKeywordsDensityAssessment(config?.relatedKeywordsDensity),\n new TextLengthAssessment(config?.textLength),\n ];\n }\n}\n"],"mappings":"AAAA,OAAOA,QAAQ;AACf,OAAOC,6BAA6B;AACpC,OAAOC,gCAAgC;AACvC,OAAOC,qBAAqB;AAC5B,OAAOC,kBAAkB;AACzB,OAAOC,aAAa;AACpB,OAAOC,0BAA0B;AACjC,OAAOC,uBAAuB;AAC9B,OAAOC,qBAAqB;AAC5B,OAAOC,UAAU;AACjB,OAAOC,UAAU;AACjB,OAAOC,kBAAkB;AACzB,OAAOC,mBAAmB;AAC1B,OAAOC,qBAAqB;AAC5B,OAAOC,mBAAmB;AAC1B,OAAOC,2BAA2B;AAClC,OAAOC,oBAAoB;AAC3B,OAAOC,oBAAoB;AAC3B,OAAOC,0BAA0B;AACjC,OAAOC,gBAAgB;AACvB,OAAOC,cAAc;AACrB,OAAOC,qBAAqB;AAC5B,OAAOC,sBAAsB;AAC7B,OAAOC,2BAA2B;AAClC,OAAOC,gCAAgC;;AAEvC;AACA;AACA;AACA,eAAe,MAAMC,WAAW,SAASzB,QAAQ,CAAC;EAChD;AACF;AACA;AACA;AACA;EACE0B,WAAWA,CAACC,UAAU,EAAEC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"seoAssessor.js","names":["Assessor","IntroductionKeywordAssessment","MetaDescriptionKeywordAssessment","MetaDescriptionLength","SubheadingsKeyword","OutboundLinks","KeyphraseDensityAssessment","InternalLinksAssessment","SlugKeywordAssessment","ImageCount","TitleWidth","SingleH1Assessment","KeyphraseAssessment","SingleTitleAssessment","UrlLengthAssessment","NumberInMetaTitleAssessment","TextImagesAssessment","TextLengthAssessment","MetaTitleKeywordAssessment","SchemaAssessment","FAQsAssessment","KeywordFAQsAssessment","InvalidCharactersInUrl","FAQsStructureDataAssessment","RelatedKeywordsDensityAssessment","SEOAssessor","constructor","researcher","config","type","_assessments","titleKeyword","textImages","numberTitle","introductionKeyword","metaDescriptionKeyword","metaDescriptionLength","subheadingsKeyword","externalLinks","keyphraseDensity","media","urlLength","singleTitle","keyphrase","internalLinks","titleWidth","slugKeyword","singleH1","schema","faqs","keywordFaqs","faqsStructuredData","charactersUrl","relatedKeywordsDensity","textLength"],"sources":["../../../../src/scoring/assessors/seoAssessor.js"],"sourcesContent":["import Assessor from './assessor';\nimport IntroductionKeywordAssessment from '../assessments/seo/IntroductionKeywordAssessment';\nimport MetaDescriptionKeywordAssessment from '../assessments/seo/MetaDescriptionKeywordAssessment';\nimport MetaDescriptionLength from '../assessments/seo/MetaDescriptionLengthAssessment';\nimport SubheadingsKeyword from '../assessments/seo/SubHeadingsKeywordAssessment';\nimport OutboundLinks from '../assessments/seo/OutboundLinksAssessment';\nimport KeyphraseDensityAssessment from '../assessments/seo/KeywordDensityAssessment';\nimport InternalLinksAssessment from '../assessments/seo/InternalLinksAssessment';\nimport SlugKeywordAssessment from '../assessments/seo/UrlKeywordAssessment';\nimport ImageCount from '../assessments/seo/ImageCountAssessment';\nimport TitleWidth from '../assessments/seo/PageTitleWidthAssessment';\nimport SingleH1Assessment from '../assessments/seo/SingleH1Assessment';\nimport KeyphraseAssessment from '../assessments/seo/KeyphraseAssessment';\nimport SingleTitleAssessment from '../assessments/seo/SingleTitleAssessment';\nimport UrlLengthAssessment from '../assessments/seo/UrlLengthAssessment';\nimport NumberInMetaTitleAssessment from '../assessments/seo/NumberInMetaTitleAssessment';\nimport TextImagesAssessment from '../assessments/seo/TextImagesAssessment';\nimport TextLengthAssessment from '../assessments/seo/TextLengthAssessment';\nimport MetaTitleKeywordAssessment from '../assessments/seo/MetaTitleKeywordAssessment';\nimport SchemaAssessment from '@axyseo/scoring/assessments/seo/SchemaAssessment';\nimport FAQsAssessment from '../assessments/seo/FAQsAssessment';\nimport KeywordFAQsAssessment from '../assessments/seo/KeywordFAQsAssessment';\nimport InvalidCharactersInUrl from '../assessments/seo/InvalidCharactersInUrl';\nimport FAQsStructureDataAssessment from '@axyseo/scoring/assessments/seo/FAQsStructureDataAssessment';\nimport RelatedKeywordsDensityAssessment from '@axyseo/scoring/assessments/seo/RelatedKeywordsDensityAssessment';\n\n/**\n * The SEOAssessor class is used for the general SEO analysis.\n */\nexport default class SEOAssessor extends Assessor {\n /**\n * Creates a new SEOAssessor instance.\n * @param {Researcher}\tresearcher\tThe researcher to use.\n * @param {Object}\t\t[config]\tThe assessor config.\n */\n constructor(researcher, config = {}) {\n super(researcher, config);\n this.type = 'SEOAssessor';\n\n this._assessments = [\n new MetaTitleKeywordAssessment(config?.titleKeyword),\n new TextImagesAssessment(config?.textImages),\n new NumberInMetaTitleAssessment(config?.numberTitle),\n new IntroductionKeywordAssessment(config?.introductionKeyword),\n new MetaDescriptionKeywordAssessment(config?.metaDescriptionKeyword),\n new MetaDescriptionLength(config?.metaDescriptionLength),\n new SubheadingsKeyword(config?.subheadingsKeyword),\n new OutboundLinks(config?.externalLinks),\n new KeyphraseDensityAssessment(config?.keyphraseDensity),\n new ImageCount(config?.media),\n new UrlLengthAssessment(config?.urlLength),\n new SingleTitleAssessment(config?.singleTitle),\n new KeyphraseAssessment(config?.keyphrase),\n new InternalLinksAssessment(config?.internalLinks),\n new TitleWidth(config?.titleWidth),\n new SlugKeywordAssessment(config?.slugKeyword),\n new SingleH1Assessment(config?.singleH1),\n new SchemaAssessment(config?.schema),\n new FAQsAssessment(config?.faqs),\n new KeywordFAQsAssessment(config?.keywordFaqs),\n new FAQsStructureDataAssessment(config?.faqsStructuredData),\n new InvalidCharactersInUrl(config?.charactersUrl),\n new RelatedKeywordsDensityAssessment(config?.relatedKeywordsDensity),\n new TextLengthAssessment(config?.textLength),\n ];\n }\n}\n"],"mappings":"AAAA,OAAOA,QAAQ;AACf,OAAOC,6BAA6B;AACpC,OAAOC,gCAAgC;AACvC,OAAOC,qBAAqB;AAC5B,OAAOC,kBAAkB;AACzB,OAAOC,aAAa;AACpB,OAAOC,0BAA0B;AACjC,OAAOC,uBAAuB;AAC9B,OAAOC,qBAAqB;AAC5B,OAAOC,UAAU;AACjB,OAAOC,UAAU;AACjB,OAAOC,kBAAkB;AACzB,OAAOC,mBAAmB;AAC1B,OAAOC,qBAAqB;AAC5B,OAAOC,mBAAmB;AAC1B,OAAOC,2BAA2B;AAClC,OAAOC,oBAAoB;AAC3B,OAAOC,oBAAoB;AAC3B,OAAOC,0BAA0B;AACjC,OAAOC,gBAAgB;AACvB,OAAOC,cAAc;AACrB,OAAOC,qBAAqB;AAC5B,OAAOC,sBAAsB;AAC7B,OAAOC,2BAA2B;AAClC,OAAOC,gCAAgC;;AAEvC;AACA;AACA;AACA,eAAe,MAAMC,WAAW,SAASzB,QAAQ,CAAC;EAChD;AACF;AACA;AACA;AACA;EACE0B,WAAWA,CAACC,UAAU,EAAEC,MAAM,GAAG,CAAC,CAAC,EAAE;IACnC,KAAK,CAACD,UAAU,EAAEC,MAAM,CAAC;IACzB,IAAI,CAACC,IAAI,GAAG,aAAa;IAEzB,IAAI,CAACC,YAAY,GAAG,CAClB,IAAIZ,0BAA0B,CAACU,MAAM,EAAEG,YAAY,CAAC,EACpD,IAAIf,oBAAoB,CAACY,MAAM,EAAEI,UAAU,CAAC,EAC5C,IAAIjB,2BAA2B,CAACa,MAAM,EAAEK,WAAW,CAAC,EACpD,IAAIhC,6BAA6B,CAAC2B,MAAM,EAAEM,mBAAmB,CAAC,EAC9D,IAAIhC,gCAAgC,CAAC0B,MAAM,EAAEO,sBAAsB,CAAC,EACpE,IAAIhC,qBAAqB,CAACyB,MAAM,EAAEQ,qBAAqB,CAAC,EACxD,IAAIhC,kBAAkB,CAACwB,MAAM,EAAES,kBAAkB,CAAC,EAClD,IAAIhC,aAAa,CAACuB,MAAM,EAAEU,aAAa,CAAC,EACxC,IAAIhC,0BAA0B,CAACsB,MAAM,EAAEW,gBAAgB,CAAC,EACxD,IAAI9B,UAAU,CAACmB,MAAM,EAAEY,KAAK,CAAC,EAC7B,IAAI1B,mBAAmB,CAACc,MAAM,EAAEa,SAAS,CAAC,EAC1C,IAAI5B,qBAAqB,CAACe,MAAM,EAAEc,WAAW,CAAC,EAC9C,IAAI9B,mBAAmB,CAACgB,MAAM,EAAEe,SAAS,CAAC,EAC1C,IAAIpC,uBAAuB,CAACqB,MAAM,EAAEgB,aAAa,CAAC,EAClD,IAAIlC,UAAU,CAACkB,MAAM,EAAEiB,UAAU,CAAC,EAClC,IAAIrC,qBAAqB,CAACoB,MAAM,EAAEkB,WAAW,CAAC,EAC9C,IAAInC,kBAAkB,CAACiB,MAAM,EAAEmB,QAAQ,CAAC,EACxC,IAAI5B,gBAAgB,CAACS,MAAM,EAAEoB,MAAM,CAAC,EACpC,IAAI5B,cAAc,CAACQ,MAAM,EAAEqB,IAAI,CAAC,EAChC,IAAI5B,qBAAqB,CAACO,MAAM,EAAEsB,WAAW,CAAC,EAC9C,IAAI3B,2BAA2B,CAACK,MAAM,EAAEuB,kBAAkB,CAAC,EAC3D,IAAI7B,sBAAsB,CAACM,MAAM,EAAEwB,aAAa,CAAC,EACjD,IAAI5B,gCAAgC,CAACI,MAAM,EAAEyB,sBAAsB,CAAC,EACpE,IAAIpC,oBAAoB,CAACW,MAAM,EAAE0B,UAAU,CAAC,CAC7C;EACH;AACF","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "axyseo",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.39",
|
|
4
4
|
"main": "build/cjs/index.js",
|
|
5
5
|
"module": "build/esm/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -23,8 +23,6 @@
|
|
|
23
23
|
"build/"
|
|
24
24
|
],
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@shopify/polaris": "^13.9.1",
|
|
27
|
-
"@shopify/polaris-icons": "^8.2.0",
|
|
28
26
|
"htmlparser2": "^3.9.2",
|
|
29
27
|
"lodash": "^4.17.21",
|
|
30
28
|
"loglevel": "^1.8.1",
|