axyseo 2.1.38 → 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/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/assessors/avadaAssessor.js +1 -1
- 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/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/assessors/avadaAssessor.js +1 -1
- 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
|
@@ -122,16 +122,15 @@ function isInternalLink(anchorUrl, siteUrlOrDomain) {
|
|
|
122
122
|
if (!anchorUrlHostName) {
|
|
123
123
|
return true;
|
|
124
124
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
const stripWww = hostname => hostname ? hostname.replace(/^www\./, "") : hostname;
|
|
126
|
+
const normalizedAnchorHostName = stripWww(anchorUrlHostName);
|
|
127
|
+
const normalizedSiteUrlOrDomain = stripWww(siteUrlOrDomain);
|
|
128
|
+
if (normalizedAnchorHostName === normalizedSiteUrlOrDomain) {
|
|
128
129
|
return true;
|
|
129
130
|
}
|
|
130
|
-
|
|
131
|
-
// If the siteUrlOrDomain variable is a URL and it shares the hostname with the anchor URL, it's an internal link.
|
|
132
131
|
const parsedSiteUrlOrDomain = _url.default.parse(siteUrlOrDomain);
|
|
133
132
|
const siteUrlOrDomainHostName = parsedSiteUrlOrDomain.hostname;
|
|
134
|
-
return
|
|
133
|
+
return normalizedAnchorHostName === stripWww(siteUrlOrDomainHostName);
|
|
135
134
|
}
|
|
136
135
|
|
|
137
136
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","names":["_url","_interopRequireDefault","require","e","__esModule","default","urlFromAnchorRegex","removeHash","url","split","removeQueryArgs","removeTrailingSlash","replace","addTrailingSlash","getFromAnchorTag","anchorTag","urlMatch","exec","areEqual","urlA","urlB","getHostname","urlMethods","parse","hostname","getProtocol","protocol","isInternalLink","anchorUrl","siteUrlOrDomain","parsedAnchorUrl","anchorUrlHostName","indexOf","parsedSiteUrlOrDomain","siteUrlOrDomainHostName","protocolIsHttpScheme","isRelativeFragmentURL","_default","exports"],"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":["_url","_interopRequireDefault","require","e","__esModule","default","urlFromAnchorRegex","removeHash","url","split","removeQueryArgs","removeTrailingSlash","replace","addTrailingSlash","getFromAnchorTag","anchorTag","urlMatch","exec","areEqual","urlA","urlB","getHostname","urlMethods","parse","hostname","getProtocol","protocol","isInternalLink","anchorUrl","siteUrlOrDomain","parsedAnchorUrl","anchorUrlHostName","indexOf","stripWww","normalizedAnchorHostName","normalizedSiteUrlOrDomain","parsedSiteUrlOrDomain","siteUrlOrDomainHostName","protocolIsHttpScheme","isRelativeFragmentURL","_default","exports"],"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":";;;;;;AACA,IAAAA,IAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA6B,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAD7B,MAAMG,kBAAkB,GAAG,wBAAwB;AAGnD;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,UAAUA,CAAEC,GAAG,EAAG;EAC1B,OAAOA,GAAG,CAACC,KAAK,CAAE,GAAI,CAAC,CAAE,CAAC,CAAE;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,eAAeA,CAAEF,GAAG,EAAG;EAC/B,OAAOA,GAAG,CAACC,KAAK,CAAE,GAAI,CAAC,CAAE,CAAC,CAAE;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASE,mBAAmBA,CAAEH,GAAG,EAAG;EACnC,OAAOA,GAAG,CAACI,OAAO,CAAE,KAAK,EAAE,EAAG,CAAC;AAChC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,gBAAgBA,CAAEL,GAAG,EAAG;EAChC,OAAOG,mBAAmB,CAAEH,GAAI,CAAC,GAAG,GAAG;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASM,gBAAgBA,CAAEC,SAAS,EAAG;EACtC,MAAMC,QAAQ,GAAGV,kBAAkB,CAACW,IAAI,CAAEF,SAAU,CAAC;EAErD,OAASC,QAAQ,KAAK,IAAI,GAAK,EAAE,GAAGA,QAAQ,CAAE,CAAC,CAAE;AAClD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASE,QAAQA,CAAEC,IAAI,EAAEC,IAAI,EAAG;EAC/B;EACAD,IAAI,GAAGT,eAAe,CAAEH,UAAU,CAAEY,IAAK,CAAE,CAAC;EAC5CC,IAAI,GAAGV,eAAe,CAAEH,UAAU,CAAEa,IAAK,CAAE,CAAC;EAE5C,OAAOP,gBAAgB,CAAEM,IAAK,CAAC,KAAKN,gBAAgB,CAAEO,IAAK,CAAC;AAC7D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,WAAWA,CAAEb,GAAG,EAAG;EAC3BA,GAAG,GAAGc,YAAU,CAACC,KAAK,CAAEf,GAAI,CAAC;EAE7B,OAAOA,GAAG,CAACgB,QAAQ;AACpB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,WAAWA,CAAEjB,GAAG,EAAG;EAC3B,OAAOc,YAAU,CAACC,KAAK,CAAEf,GAAI,CAAC,CAACkB,QAAQ;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,cAAcA,CAAEC,SAAS,EAAEC,eAAe,EAAG;EACpD,MAAMC,eAAe,GAAGR,YAAU,CAACC,KAAK,CAAEK,SAAS,EAAE,KAAK,EAAE,IAAK,CAAC;EAClE,MAAMG,iBAAiB,GAAGD,eAAe,CAACN,QAAQ;;EAElD;EACA,IAAKI,SAAS,CAACI,OAAO,CAAE,IAAK,CAAC,KAAK,CAAC,CAAC,IAAIJ,SAAS,CAACI,OAAO,CAAE,GAAI,CAAC,KAAK,CAAC,EAAG;IACxE,OAAO,IAAI;EACb;;EAEA;EACA,IAAKJ,SAAS,CAACI,OAAO,CAAE,GAAI,CAAC,KAAK,CAAC,EAAG;IACpC,OAAO,KAAK;EACd;;EAEA;EACA,IAAK,CAAED,iBAAiB,EAAG;IACzB,OAAO,IAAI;EACb;EAEA,MAAME,QAAQ,GAAKT,QAAQ,IAAMA,QAAQ,GAAGA,QAAQ,CAACZ,OAAO,CAAE,QAAQ,EAAE,EAAG,CAAC,GAAGY,QAAQ;EACvF,MAAMU,wBAAwB,GAAGD,QAAQ,CAAEF,iBAAkB,CAAC;EAC9D,MAAMI,yBAAyB,GAAGF,QAAQ,CAAEJ,eAAgB,CAAC;EAE7D,IAAKK,wBAAwB,KAAKC,yBAAyB,EAAG;IAC5D,OAAO,IAAI;EACb;EAEA,MAAMC,qBAAqB,GAAGd,YAAU,CAACC,KAAK,CAAEM,eAAgB,CAAC;EACjE,MAAMQ,uBAAuB,GAAGD,qBAAqB,CAACZ,QAAQ;EAC9D,OAAOU,wBAAwB,KAAKD,QAAQ,CAAEI,uBAAwB,CAAC;AACzE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,oBAAoBA,CAAEZ,QAAQ,EAAG;EACzC,IAAK,CAAEA,QAAQ,EAAG;IACjB,OAAO,KAAK;EACb;EAEA,OAASA,QAAQ,KAAK,OAAO,IAAIA,QAAQ,KAAK,QAAQ;AACvD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASa,qBAAqBA,CAAE/B,GAAG,EAAG;EACrC,OAAOA,GAAG,CAACwB,OAAO,CAAE,GAAI,CAAC,KAAK,CAAC;AAChC;AAAC,IAAAQ,QAAA,GAAAC,OAAA,CAAApC,OAAA,GAEc;EACdE,UAAU,EAAEA,UAAU;EACtBG,eAAe,EAAEA,eAAe;EAChCC,mBAAmB,EAAEA,mBAAmB;EACxCE,gBAAgB,EAAEA,gBAAgB;EAClCC,gBAAgB,EAAEA,gBAAgB;EAClCI,QAAQ,EAAEA,QAAQ;EAClBG,WAAW,EAAEA,WAAW;EACxBI,WAAW,EAAEA,WAAW;EACxBE,cAAc,EAAEA,cAAc;EAC9BW,oBAAoB,EAAEA,oBAAoB;EAC1CC,qBAAqB,EAAEA;AACxB,CAAC","ignoreList":[]}
|
|
@@ -4,12 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = _default;
|
|
7
|
-
var _index = require("../../../../index.js");
|
|
8
7
|
var _removeURLs = _interopRequireDefault(require("../../../helpers/sanitize/removeURLs.js"));
|
|
9
8
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
-
const {
|
|
11
|
-
sanitizeString
|
|
12
|
-
} = _index.languageProcessing;
|
|
13
9
|
/**
|
|
14
10
|
* Calculates the character count which serves as a measure of text length.
|
|
15
11
|
* The character count includes letters, punctuation, and numbers. It doesn't include URLs, HTML tags, and spaces.
|
|
@@ -20,7 +16,7 @@ const {
|
|
|
20
16
|
*/
|
|
21
17
|
function _default(text) {
|
|
22
18
|
text = (0, _removeURLs.default)(text);
|
|
23
|
-
text = sanitizeString(text);
|
|
19
|
+
// text = sanitizeString(text);
|
|
24
20
|
text = text.replace(/\s/g, '');
|
|
25
21
|
return text.length;
|
|
26
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"countCharacters.js","names":["
|
|
1
|
+
{"version":3,"file":"countCharacters.js","names":["_removeURLs","_interopRequireDefault","require","e","__esModule","default","_default","text","removeURLs","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,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAiE,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAAG,SAASC,IAAI,EAAE;EAC5BA,IAAI,GAAG,IAAAC,mBAAU,EAACD,IAAI,CAAC;EACvB;EACAA,IAAI,GAAGA,IAAI,CAACE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;EAE9B,OAAOF,IAAI,CAACG,MAAM;AACpB","ignoreList":[]}
|
|
@@ -48,7 +48,7 @@ class AvadaAssessor {
|
|
|
48
48
|
this.researcher = researcher;
|
|
49
49
|
this.config = config;
|
|
50
50
|
}
|
|
51
|
-
assess(paper, i18n) {
|
|
51
|
+
assess(paper, i18n = null) {
|
|
52
52
|
this.seoAssessor.assess(paper, i18n);
|
|
53
53
|
this.contentAssessor.assess(paper, i18n);
|
|
54
54
|
let assessments = [...this.seoAssessor.results, ...this.contentAssessor.results];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avadaAssessor.js","names":["_index","require","_helpers","AvadaAssessor","constructor","researcher","config","seoAssessor","SEOAssessor","contentAssessor","ContentAssessor","assess","paper","i18n","assessments","results","map","assessment","status","score","data","title","assessBackEnd","getResult","groupBy","getScore","groupAssessmentsByCategory","groupAssessmentsByStatus","point","forEach","Math","round","exports","default"],"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) {\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":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAEA;AACA;AACA;AACe,MAAME,aAAa,CAAC;EACjC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,WAAWA,CAACC,UAAU,EAAEC,MAAM,GAAG,CAAC,CAAC,EAAE;IACnC,MAAMC,WAAW,GAAG,IAAIC,kBAAW,CAACH,UAAU,EAAEC,MAAM,CAAC;IACvD,MAAMG,eAAe,GAAG,IAAIC,sBAAe,CAACL,UAAU,EAAEC,MAAM,CAAC;IAC/D,IAAI,CAACC,WAAW,GAAGA,WAAW;IAC9B,IAAI,CAACE,eAAe,GAAGA,eAAe;IACtC,IAAI,CAACJ,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACC,MAAM,GAAGA,MAAM;EACtB;EAEAK,MAAMA,CAACC,KAAK,EAAEC,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"avadaAssessor.js","names":["_index","require","_helpers","AvadaAssessor","constructor","researcher","config","seoAssessor","SEOAssessor","contentAssessor","ContentAssessor","assess","paper","i18n","assessments","results","map","assessment","status","score","data","title","assessBackEnd","getResult","groupBy","getScore","groupAssessmentsByCategory","groupAssessmentsByStatus","point","forEach","Math","round","exports","default"],"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":[]}
|
|
@@ -22,7 +22,7 @@ class ContentAssessor extends _assessor.default {
|
|
|
22
22
|
* @param {Researcher} researcher The researcher to use.
|
|
23
23
|
* @param {Object} [config] The assessor config.
|
|
24
24
|
*/
|
|
25
|
-
constructor(researcher, config) {
|
|
25
|
+
constructor(researcher, config = {}) {
|
|
26
26
|
super(researcher, config);
|
|
27
27
|
this.type = 'contentAssessor';
|
|
28
28
|
this._assessments = [new _ParagraphTooLongAssessment.default(config?.textParagraphTooLong), new _SentenceLengthInTextAssessment.default(config?.textSentenceLength), new _TransitionWordsAssessment.default(config?.textTransitionWords), new _SentenceBeginningsAssessment.default(config?.sentenceBeginnings), new _RelatedKeywordsAssessment.default(config?.relatedKeywords)];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contentAssessor.js","names":["_lodash","require","_assessor","_interopRequireDefault","_ParagraphTooLongAssessment","_SentenceLengthInTextAssessment","_SentenceBeginningsAssessment","_TransitionWordsAssessment","_RelatedKeywordsAssessment","_scoreToRating","e","__esModule","default","ContentAssessor","Assessor","constructor","researcher","config","type","_assessments","ParagraphTooLong","textParagraphTooLong","SentenceLengthInText","textSentenceLength","TransitionWords","textTransitionWords","SentenceBeginnings","sentenceBeginnings","RelatedKeywordsAssessment","relatedKeywords","calculatePenaltyPointsFullSupport","rating","calculatePenaltyPointsPartialSupport","_allAssessmentsSupported","numberOfAssessments","length","applicableAssessments","getApplicableAssessments","calculatePenaltyPoints","results","getValidResults","penaltyPoints","map","result","scoreToRating","getScore","bind","sum","_ratePenaltyPoints","totalPenaltyPoints","calculateOverallScore","exports"],"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,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,SAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,2BAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,+BAAA,GAAAF,sBAAA,CAAAF,OAAA;AACA,IAAAK,6BAAA,GAAAH,sBAAA,CAAAF,OAAA;AACA,IAAAM,0BAAA,GAAAJ,sBAAA,CAAAF,OAAA;AACA,IAAAO,0BAAA,GAAAL,sBAAA,CAAAF,OAAA;AACA,IAAAQ,cAAA,GAAAN,sBAAA,CAAAF,OAAA;AAA6D,SAAAE,uBAAAO,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE7D;AACA;AACA;AACe,MAAMG,eAAe,SAASC,iBAAQ,CAAC;EACpD;AACF;AACA;AACA;AACA;EACEC,WAAWA,CAACC,UAAU,EAAEC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"contentAssessor.js","names":["_lodash","require","_assessor","_interopRequireDefault","_ParagraphTooLongAssessment","_SentenceLengthInTextAssessment","_SentenceBeginningsAssessment","_TransitionWordsAssessment","_RelatedKeywordsAssessment","_scoreToRating","e","__esModule","default","ContentAssessor","Assessor","constructor","researcher","config","type","_assessments","ParagraphTooLong","textParagraphTooLong","SentenceLengthInText","textSentenceLength","TransitionWords","textTransitionWords","SentenceBeginnings","sentenceBeginnings","RelatedKeywordsAssessment","relatedKeywords","calculatePenaltyPointsFullSupport","rating","calculatePenaltyPointsPartialSupport","_allAssessmentsSupported","numberOfAssessments","length","applicableAssessments","getApplicableAssessments","calculatePenaltyPoints","results","getValidResults","penaltyPoints","map","result","scoreToRating","getScore","bind","sum","_ratePenaltyPoints","totalPenaltyPoints","calculateOverallScore","exports"],"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":[]}
|
|
@@ -39,7 +39,7 @@ class SEOAssessor extends _assessor.default {
|
|
|
39
39
|
* @param {Researcher} researcher The researcher to use.
|
|
40
40
|
* @param {Object} [config] The assessor config.
|
|
41
41
|
*/
|
|
42
|
-
constructor(researcher, config) {
|
|
42
|
+
constructor(researcher, config = {}) {
|
|
43
43
|
super(researcher, config);
|
|
44
44
|
this.type = 'SEOAssessor';
|
|
45
45
|
this._assessments = [new _MetaTitleKeywordAssessment.default(config?.titleKeyword), new _TextImagesAssessment.default(config?.textImages), new _NumberInMetaTitleAssessment.default(config?.numberTitle), new _IntroductionKeywordAssessment.default(config?.introductionKeyword), new _MetaDescriptionKeywordAssessment.default(config?.metaDescriptionKeyword), new _MetaDescriptionLengthAssessment.default(config?.metaDescriptionLength), new _SubHeadingsKeywordAssessment.default(config?.subheadingsKeyword), new _OutboundLinksAssessment.default(config?.externalLinks), new _KeywordDensityAssessment.default(config?.keyphraseDensity), new _ImageCountAssessment.default(config?.media), new _UrlLengthAssessment.default(config?.urlLength), new _SingleTitleAssessment.default(config?.singleTitle), new _KeyphraseAssessment.default(config?.keyphrase), new _InternalLinksAssessment.default(config?.internalLinks), new _PageTitleWidthAssessment.default(config?.titleWidth), new _UrlKeywordAssessment.default(config?.slugKeyword), new _SingleH1Assessment.default(config?.singleH1), new _SchemaAssessment.default(config?.schema), new _FAQsAssessment.default(config?.faqs), new _KeywordFAQsAssessment.default(config?.keywordFaqs), new _FAQsStructureDataAssessment.default(config?.faqsStructuredData), new _InvalidCharactersInUrl.default(config?.charactersUrl), new _RelatedKeywordsDensityAssessment.default(config?.relatedKeywordsDensity), new _TextLengthAssessment.default(config?.textLength)];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seoAssessor.js","names":["_assessor","_interopRequireDefault","require","_IntroductionKeywordAssessment","_MetaDescriptionKeywordAssessment","_MetaDescriptionLengthAssessment","_SubHeadingsKeywordAssessment","_OutboundLinksAssessment","_KeywordDensityAssessment","_InternalLinksAssessment","_UrlKeywordAssessment","_ImageCountAssessment","_PageTitleWidthAssessment","_SingleH1Assessment","_KeyphraseAssessment","_SingleTitleAssessment","_UrlLengthAssessment","_NumberInMetaTitleAssessment","_TextImagesAssessment","_TextLengthAssessment","_MetaTitleKeywordAssessment","_SchemaAssessment","_FAQsAssessment","_KeywordFAQsAssessment","_InvalidCharactersInUrl","_FAQsStructureDataAssessment","_RelatedKeywordsDensityAssessment","e","__esModule","default","SEOAssessor","Assessor","constructor","researcher","config","type","_assessments","MetaTitleKeywordAssessment","titleKeyword","TextImagesAssessment","textImages","NumberInMetaTitleAssessment","numberTitle","IntroductionKeywordAssessment","introductionKeyword","MetaDescriptionKeywordAssessment","metaDescriptionKeyword","MetaDescriptionLength","metaDescriptionLength","SubheadingsKeyword","subheadingsKeyword","OutboundLinks","externalLinks","KeyphraseDensityAssessment","keyphraseDensity","ImageCount","media","UrlLengthAssessment","urlLength","SingleTitleAssessment","singleTitle","KeyphraseAssessment","keyphrase","InternalLinksAssessment","internalLinks","TitleWidth","titleWidth","SlugKeywordAssessment","slugKeyword","SingleH1Assessment","singleH1","SchemaAssessment","schema","FAQsAssessment","faqs","KeywordFAQsAssessment","keywordFaqs","FAQsStructureDataAssessment","faqsStructuredData","InvalidCharactersInUrl","charactersUrl","RelatedKeywordsDensityAssessment","relatedKeywordsDensity","TextLengthAssessment","textLength","exports"],"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,IAAAA,SAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,8BAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,iCAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,gCAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,6BAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,wBAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,yBAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,wBAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,qBAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,qBAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,yBAAA,GAAAX,sBAAA,CAAAC,OAAA;AACA,IAAAW,mBAAA,GAAAZ,sBAAA,CAAAC,OAAA;AACA,IAAAY,oBAAA,GAAAb,sBAAA,CAAAC,OAAA;AACA,IAAAa,sBAAA,GAAAd,sBAAA,CAAAC,OAAA;AACA,IAAAc,oBAAA,GAAAf,sBAAA,CAAAC,OAAA;AACA,IAAAe,4BAAA,GAAAhB,sBAAA,CAAAC,OAAA;AACA,IAAAgB,qBAAA,GAAAjB,sBAAA,CAAAC,OAAA;AACA,IAAAiB,qBAAA,GAAAlB,sBAAA,CAAAC,OAAA;AACA,IAAAkB,2BAAA,GAAAnB,sBAAA,CAAAC,OAAA;AACA,IAAAmB,iBAAA,GAAApB,sBAAA,CAAAC,OAAA;AACA,IAAAoB,eAAA,GAAArB,sBAAA,CAAAC,OAAA;AACA,IAAAqB,sBAAA,GAAAtB,sBAAA,CAAAC,OAAA;AACA,IAAAsB,uBAAA,GAAAvB,sBAAA,CAAAC,OAAA;AACA,IAAAuB,4BAAA,GAAAxB,sBAAA,CAAAC,OAAA;AACA,IAAAwB,iCAAA,GAAAzB,sBAAA,CAAAC,OAAA;AAAgH,SAAAD,uBAAA0B,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEhH;AACA;AACA;AACe,MAAMG,WAAW,SAASC,iBAAQ,CAAC;EAChD;AACF;AACA;AACA;AACA;EACEC,WAAWA,CAACC,UAAU,EAAEC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"seoAssessor.js","names":["_assessor","_interopRequireDefault","require","_IntroductionKeywordAssessment","_MetaDescriptionKeywordAssessment","_MetaDescriptionLengthAssessment","_SubHeadingsKeywordAssessment","_OutboundLinksAssessment","_KeywordDensityAssessment","_InternalLinksAssessment","_UrlKeywordAssessment","_ImageCountAssessment","_PageTitleWidthAssessment","_SingleH1Assessment","_KeyphraseAssessment","_SingleTitleAssessment","_UrlLengthAssessment","_NumberInMetaTitleAssessment","_TextImagesAssessment","_TextLengthAssessment","_MetaTitleKeywordAssessment","_SchemaAssessment","_FAQsAssessment","_KeywordFAQsAssessment","_InvalidCharactersInUrl","_FAQsStructureDataAssessment","_RelatedKeywordsDensityAssessment","e","__esModule","default","SEOAssessor","Assessor","constructor","researcher","config","type","_assessments","MetaTitleKeywordAssessment","titleKeyword","TextImagesAssessment","textImages","NumberInMetaTitleAssessment","numberTitle","IntroductionKeywordAssessment","introductionKeyword","MetaDescriptionKeywordAssessment","metaDescriptionKeyword","MetaDescriptionLength","metaDescriptionLength","SubheadingsKeyword","subheadingsKeyword","OutboundLinks","externalLinks","KeyphraseDensityAssessment","keyphraseDensity","ImageCount","media","UrlLengthAssessment","urlLength","SingleTitleAssessment","singleTitle","KeyphraseAssessment","keyphrase","InternalLinksAssessment","internalLinks","TitleWidth","titleWidth","SlugKeywordAssessment","slugKeyword","SingleH1Assessment","singleH1","SchemaAssessment","schema","FAQsAssessment","faqs","KeywordFAQsAssessment","keywordFaqs","FAQsStructureDataAssessment","faqsStructuredData","InvalidCharactersInUrl","charactersUrl","RelatedKeywordsDensityAssessment","relatedKeywordsDensity","TextLengthAssessment","textLength","exports"],"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":"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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":[]}
|
|
@@ -43,7 +43,7 @@ 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];
|
|
@@ -1 +1 @@
|
|
|
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) {\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":"AAAA,SAAQA,eAAe,EAAEC,WAAW;AACpC,SAAQC,0BAA0B,EAAEC,wBAAwB;;AAE5D;AACA;AACA;AACA,eAAe,MAAMC,aAAa,CAAC;EACjC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,WAAWA,CAACC,UAAU,EAAEC,MAAM,GAAG,CAAC,CAAC,EAAE;IACnC,MAAMC,WAAW,GAAG,IAAIP,WAAW,CAACK,UAAU,EAAEC,MAAM,CAAC;IACvD,MAAME,eAAe,GAAG,IAAIT,eAAe,CAACM,UAAU,EAAEC,MAAM,CAAC;IAC/D,IAAI,CAACC,WAAW,GAAGA,WAAW;IAC9B,IAAI,CAACC,eAAe,GAAGA,eAAe;IACtC,IAAI,CAACH,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACC,MAAM,GAAGA,MAAM;EACtB;EAEAG,MAAMA,CAACC,KAAK,EAAEC,IAAI,EAAE;
|
|
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",
|