UNPKG

pyseoa-ts

Version:

SEO analysis tools for the web, ported from pyseoa (Python) to TypeScript

62 lines (61 loc) 2.21 kB
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, } }; }