UNPKG

agentsqripts

Version:

Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems

43 lines (37 loc) 2.11 kB
/** * @file Content-based similarity calculator using advanced string distance algorithms * @description Single responsibility: Assess code block similarity through normalized textual content analysis * * This calculator implements sophisticated content-based similarity using Levenshtein distance * to detect textual similarity between code blocks. It serves as the foundation layer for * similarity assessment, catching cases where structural analysis might miss surface-level * code duplication or near-duplicate implementations. * * Design rationale: * - Content normalization reduces noise from formatting and naming differences * - Levenshtein distance provides accurate measurement of textual similarity between implementations * - Normalized scoring (0.0 to 1.0) enables consistent similarity comparison across content lengths * - Fallback to raw content ensures analysis continues when normalization unavailable * - Edge case handling for empty content prevents calculation errors * * Content similarity methodology: * - Normalized content preferred for cleaner similarity assessment without formatting noise * - Levenshtein distance measures minimum edit operations needed to transform one block to another * - Distance normalization by maximum content length provides proportional similarity scoring * - Perfect similarity (1.0) for identical content after normalization * - Zero similarity (0.0) for completely different implementations requiring full rewrite */ const levenshtein = require('../../../../utils/levenshtein'); /** * Calculate content similarity using normalized content */ function calculateContentSimilarity(block1, block2) { const content1 = block1.normalizedContent || block1.content; const content2 = block2.normalizedContent || block2.content; // Use Levenshtein distance for content similarity const distance = levenshtein(content1, content2); const maxLength = Math.max(content1.length, content2.length); if (maxLength === 0) return 1.0; return 1 - (distance / maxLength); } module.exports = calculateContentSimilarity;