pyseoa-ts
Version:
SEO analysis tools for the web, ported from pyseoa (Python) to TypeScript
62 lines (61 loc) • 2.21 kB
JavaScript
import { analyzeCanonical } from '../analyzer/canonical';
import { analyzeH1 } from '../analyzer/h1';
import { analyzeKeywordDensity } from '../analyzer/keywordDensity';
import { analyzeKeywords } from '../analyzer/keywords';
import { analyzeMetaDescription } from '../analyzer/metaDescription';
import { analyzeOpenGraph } from '../analyzer/openGraph';
import { analyzeRobots } from '../analyzer/robots';
import { analyzeTitle } from '../analyzer/title';
import { analyzeTwitterCard } from '../analyzer/twitterCard';
const defaultOptions = {
keywordDensity: true,
densityThresholds: {
low: 0.5,
high: 2.0,
}
};
export function runAnalysis(html, options) {
const opts = { ...defaultOptions, ...options };
const title = analyzeTitle(html);
const metaDescription = analyzeMetaDescription(html);
const h1 = analyzeH1(html);
const canonical = analyzeCanonical(html);
const robots = analyzeRobots(html);
const keywords = analyzeKeywords(html);
const openGraph = analyzeOpenGraph(html);
const twitterCard = analyzeTwitterCard(html);
const keywordDensity = opts.keywordDensity
? keywords.keywords.map(keyword => analyzeKeywordDensity(html, keyword)) : [];
const scoreMap = {
title: title.score,
metaDescription: metaDescription.score,
h1: h1.score,
canonical: canonical.score,
robots: robots.score,
keywords: keywords.score,
openGraph: openGraph.score,
twitterCard: twitterCard.score,
...(opts.keywordDensity && {
keywordDensity: Math.round(keywordDensity.reduce((sum, d) => sum + d.score, 0) / (keywordDensity.length || 1)),
}),
};
const totalScore = Object.values(scoreMap).reduce((a, b) => a + b, 0);
const maxScore = Object.keys(scoreMap).length * 3;
return {
title,
metaDescription,
h1,
canonical,
robots,
keywords,
openGraph,
twitterCard,
keywordDensity,
scoreSummary: {
totalScore,
maxScore,
percentage: +((totalScore / maxScore) * 100).toFixed(2),
breakdown: scoreMap,
}
};
}