diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/content.config.ts | 1 | ||||
| -rw-r--r-- | src/loaders/pleroma.ts | 27 |
2 files changed, 27 insertions, 1 deletions
diff --git a/src/content.config.ts b/src/content.config.ts index 5dff41a..4b7b230 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -42,6 +42,7 @@ const micro = defineCollection({ instanceUrl: "https://social.craftknight.com", username: "dawid", maxPosts: 50, + allowedTags: ["#miniblog", "#vanlife", "#microblog", "#giereczkowo"], }), schema: baseSchema.extend({ description: z.string().optional(), diff --git a/src/loaders/pleroma.ts b/src/loaders/pleroma.ts index a833248..73d11da 100644 --- a/src/loaders/pleroma.ts +++ b/src/loaders/pleroma.ts @@ -7,6 +7,7 @@ interface PleromaFeedConfig { username: string; maxPosts?: number; accountId?: string; // Optional: if provided, skips account lookup + allowedTags?: string[]; // Optional: if provided, only posts with these tags are included } interface PleromaAccount { @@ -150,6 +151,26 @@ function isFilteredStatus(status: PleromaStatus): boolean { return false; } +function extractHashtags(htmlContent: string): string[] { + // Extract hashtags from HTML spans and plain text + const hashtagPattern = /#(\w+)/gi; + const matches = htmlContent.match(hashtagPattern); + return matches ? [...new Set(matches.map((tag) => tag.toLowerCase()))] : []; +} + +function hasAllowedTag(status: PleromaStatus, allowedTags: string[]): boolean { + if (!allowedTags || allowedTags.length === 0) { + return true; // No filtering if no tags specified + } + + const content = status.content || ""; + const hashtags = extractHashtags(content); + const normalizedAllowedTags = allowedTags.map((tag) => tag.toLowerCase().replace(/^#/, "")); + const normalizedHashtags = hashtags.map((tag) => tag.toLowerCase().replace(/^#/, "")); + + return normalizedHashtags.some((tag) => normalizedAllowedTags.includes(tag)); +} + function cleanContent(htmlContent: string): string { const turndownService = new TurndownService({ headingStyle: "atx", @@ -227,7 +248,11 @@ export function pleromaLoader(config: PleromaFeedConfig): Loader { logger.info(`Fetched ${statuses.length} statuses from API`); // Filter statuses - const validStatuses = statuses.filter((status) => !isFilteredStatus(status)); + const validStatuses = statuses.filter((status) => { + if (isFilteredStatus(status)) return false; + if (config.allowedTags && !hasAllowedTag(status, config.allowedTags)) return false; + return true; + }); logger.info(`After filtering: ${validStatuses.length} valid posts`); // Clear existing entries |
