fresh-main #3

Merged
KeyArgo merged 3 commits from fresh-main into main 2025-05-02 04:07:52 +00:00
1 changed files with 54 additions and 14 deletions

View File

@ -63,13 +63,15 @@ const graphData = {
edges: [] edges: []
}; };
// Create edges between posts and their tags // Create edges between posts and their tags, and between related posts
const processedPostPairs = new Set(); // Avoid duplicate A->B and B->A edges
sortedPosts sortedPosts
.filter(post => !post.data.draft) .filter(post => !post.data.draft)
.forEach(post => { .forEach(post => {
const postTags = post.data.tags || []; const postTags = post.data.tags || [];
// Add edges from post to tags // 1. Add edges from post to tags
postTags.forEach(tag => { postTags.forEach(tag => {
graphData.edges.push({ graphData.edges.push({
source: post.slug, source: post.slug,
@ -78,22 +80,60 @@ sortedPosts
strength: 1 strength: 1
}); });
}); });
// --- Find Related Posts (Explicit + Implicit) ---
const MAX_RELATED_LINKS = 3;
const MIN_SHARED_TAGS_FOR_LINK = 2;
// Check if post references other posts (optional) let relatedLinks = new Map(); // Use Map to store related slug and relation type (explicit/implicit)
// This requires a related_posts field in frontmatter
if (post.data.related_posts && Array.isArray(post.data.related_posts)) { // a. Find explicitly related posts
post.data.related_posts.forEach(relatedSlug => { const explicitSlugs = new Set(post.data.related_posts || []);
// Make sure related post exists explicitSlugs.forEach(slug => {
if (sortedPosts.some(p => p.slug === relatedSlug)) { if (sortedPosts.some(p => p.slug === slug && !p.data.draft)) {
graphData.edges.push({ relatedLinks.set(slug, 'explicit');
source: post.slug, }
target: relatedSlug, });
type: 'post-post',
strength: 2 // b. Find implicitly related posts by tag similarity (if needed)
}); if (relatedLinks.size < MAX_RELATED_LINKS && postTags.length > 0) {
const potentialRelated = sortedPosts
.filter(otherPost =>
!otherPost.data.draft &&
otherPost.slug !== post.slug && // Not the same post
!relatedLinks.has(otherPost.slug) // Not already added
)
.map(otherPost => {
const otherTags = otherPost.data.tags || [];
const sharedTagsCount = postTags.filter(tag => otherTags.includes(tag)).length;
return { slug: otherPost.slug, score: sharedTagsCount };
})
.filter(item => item.score >= MIN_SHARED_TAGS_FOR_LINK)
.sort((a, b) => b.score - a.score); // Sort by most shared tags
potentialRelated.forEach(item => {
if (relatedLinks.size < MAX_RELATED_LINKS) {
relatedLinks.set(item.slug, 'implicit');
} }
}); });
} }
// 2. Create edges for the found related posts
relatedLinks.forEach((relationType, relatedSlug) => {
const pairKey1 = `${post.slug}-${relatedSlug}`;
const pairKey2 = `${relatedSlug}-${post.slug}`;
if (!processedPostPairs.has(pairKey1) && !processedPostPairs.has(pairKey2)) {
graphData.edges.push({
source: post.slug,
target: relatedSlug,
type: 'post-post',
strength: relationType === 'explicit' ? 3 : 1.5 // Stronger edge for explicit links
});
processedPostPairs.add(pairKey1);
processedPostPairs.add(pairKey2); // Add both directions to set
}
});
}); });
// Terminal commands for tech effect // Terminal commands for tech effect